MSDN:
“你为你提供实例化的每个 (COM) 对象类实现一个 IClassFactory 接口。”
在没有类工厂的情况下创建 COM 类有用吗?
IClassFactory 是为调用者直接实例化的对象提供的,例如使用CreateObject
or CoCreateInstance
, or GetObject
。
其他对象可以通过从创建的对象中间接获取来获得。
例如,Scripting.FileSystemObject
在 VB 或 VBScript 中是直接创建的。可以使用方法获取File
或Folder
对象,不能直接创建。相反,它们由 FileSystemObject 创建并从 FileSystemObject 方法返回。
在没有类工厂的情况下创建 COM 类有用吗?
是的,为什么不?它仍然可以是功能齐全的 COM 类,只是不能通过CoCreateInstance
API 启动它。出于某种原因,您可能希望以其他方式使其可用,例如作为另一个接口/类的方法上的返回 [out] 参数,或通过GetActiveObject
API。
类工厂让您可以公开您的类以进行直接实例化。
我不完全确定这里的措辞是否完全正确。您几乎总是为主机将实例化的所有COM 对象类实现一次IClassFactory 。 特别是,您的 IClassFactory 实现是从DllGetClassObject返回的内容。
特别是,当有人调用 时CoCreateInstance(CLSID_foo, pUnkOuter, CLSCTX_INPROC, IID_IFoo, (void **) &pFoo)
,会发生以下事情(假设您没有进行远程处理):
CLSID_foo
COM在注册表中查找。(特别是 HKEY_CLASSES_ROOT\CLSID\\InprocServer32)。pUnkOuter
IID_IFoo
pFoo
正如@Ben 所提到的,在许多其他情况下,您将拥有无法直接创建的 COM 对象。甚至还存在其他标准工厂接口,例如IServiceProvider,以便类可以公开一组动态接口。