我知道 CoCreateInstance 为给定的类 id 找到 COM 服务器,为该 id 创建对象实例并从该对象实例中检索接口。CoGetClassObject() 为类 id 找到 COM 服务器,为该类 id 创建类工厂的实例,并检索可用于创建实际对象的类工厂接口。
当用于在同一台机器上创建对象时,这些函数还有什么不同?它们的工作方式是否相同,但只会导致在完全相同的 COM 服务器中调用不同的代码?
我知道 CoCreateInstance 为给定的类 id 找到 COM 服务器,为该 id 创建对象实例并从该对象实例中检索接口。CoGetClassObject() 为类 id 找到 COM 服务器,为该类 id 创建类工厂的实例,并检索可用于创建实际对象的类工厂接口。
当用于在同一台机器上创建对象时,这些函数还有什么不同?它们的工作方式是否相同,但只会导致在完全相同的 COM 服务器中调用不同的代码?
CoGetClassObject 本质上为您返回一个指向特定接口的工厂的指针。在底层,CoCreateInstance 使用 CoGetClassObject。调用 CoGetClassObject 的优点是,如果您想创建特定对象的许多实例,它允许您只需要创建一次类工厂。
CoGetClassObject 上的 MSDN 部分简要讨论了如何利用此功能。
除了 JaredPar 所说的之外,还有一个场景 - CoGetClassObject 返回一个类工厂(在 inproc 服务器的情况下调用 DLL 的 DLLGetClassObject 导出函数)。类工厂用于实例化 coclass。CoCreateInstance 在内部调用 CoGetClassObject,获取所需的类工厂,然后使用它来实例化您请求的 coclass。调用 CoCreateInstance 时,不能延迟创建 coclass。有时创建 coclass 的成本可能很高,您希望延迟它的创建,但仍然可以访问类工厂,以便您可以按需实例化 coclass。