在同一台机器上创build对象时,CoCreateInstance()和CoGetClassObject()有什么区别?

我明白,CoCreateInstance查找给定的类id的COM服务器,创build该id的对象实例,并从该对象实例中检索一个接口。 CoGetClassObject()为类IDfindCOM服务器,为该类的id创build类工厂的一个实例,并检索那个类的工厂接口,然后可以用它来创build实际的对象。

当在同一台机器上创build对象时,这些函数还有什么区别? 他们是否以相同的方式工作,但只能导致在完全相同的COM服务器中调用不同的代码?

    CoGetClassObject从本质上返回一个指向特定接口的工厂的指针。 在底层,CoCreateInstance使用CoGetClassObject。 调用CoGetClassObject的好处是它允许你只需要创建一个类工厂,如果你想创建一个特定对象的许多实例。

    CoGetClassObject的MSDN部分简要讨论了如何利用这个功能。

    除了JaredPar所说的一个场景 – CoGetClassObject返回给你一个类工厂(在inproc服务器的情况下,调用你的DLL的DLLGetClassObject导出函数)。 类工厂用于实例化coclass。 CoCreateInstance在内部调用CoGetClassObject,获取所需的类工厂,然后使用它来实例化您请求的类。 调用CoCreateInstance时,不能延迟创建coclass。 有时候coclass的创建可能会很昂贵,并且您希望延迟其创建,但仍然可以访问类工厂,以便您可以按需实例化coclass。