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