COM类无法实例化

时间:2013-10-03 06:58:52

标签: com

MSDN:

“您为要提供的实例化的每个(COM)对象类实现了一个IClassFactory接口。”

创建没有Class Factory的COM类是否有用?

3 个答案:

答案 0 :(得分:4)

IClassFactory是为调用者实例化 的对象提供的,例如使用CreateObjectCoCreateInstance或{{1 }}

通过从创建的对象间接获取其他对象,可以获得其他对象。

例如,VB或VBScript中的GetObject是直接创建的。您可以使用这些方法获取无法直接创建的Scripting.FileSystemObjectFile个对象。相反,这些是由FileSystemObject创建的,并从FileSystemObject方法返回。

答案 1 :(得分:1)

  

创建没有Class Factory的COM类是否有用?

是的,为什么不呢?它仍然可以是功能齐全的COM类,只是你不能通过CoCreateInstance API启动它。出于某种原因,您可能希望以其他方式使其可用,例如作为另一个接口/类的方法的返回[out]参数,或通过GetActiveObject API。

类工厂允许您公开您的类以进行直接实例化。

答案 2 :(得分:0)

我不完全确定这里的措辞是否正确。您几乎总是为主机将实例化的所有 COM类对象实现IClassFactory 一次。特别是,您的IClassFactory实现是从DllGetClassObject返回的。

特别是,当有人调用CoCreateInstance(CLSID_foo, pUnkOuter, CLSCTX_INPROC, IID_IFoo, (void **) &pFoo)时,会发生以下情况(假设您没有进行远程处理):

  1. COM在注册表中查找CLSID_foo。 (特别是HKEY_CLASSES_ROOT \ CLSID \\ InprocServer32)。
  2. COM加载该DLL并使用IID_IClassFactory调用DllGetClassObject
  3. 您的DLL返回一个指向IClassFactory
  4. 实现的函数指针
  5. COM使用pUnkOuterIID_IFoopFoo来调用IClassFactory::CreateInstance的实施。
  6. 在许多其他情况下,你将拥有不能直接创建的COM对象,正如@Ben所提到的那样。甚至还存在其他标准工厂接口,如IServiceProvider,以便类可以公开一组动态接口。