MSDN:
“您为要提供的实例化的每个(COM)对象类实现了一个IClassFactory接口。”
创建没有Class Factory的COM类是否有用?
答案 0 :(得分:4)
IClassFactory是为调用者实例化 的对象提供的,例如使用CreateObject
或CoCreateInstance
或{{1 }}
通过从创建的对象间接获取其他对象,可以获得其他对象。
例如,VB或VBScript中的GetObject
是直接创建的。您可以使用这些方法获取无法直接创建的Scripting.FileSystemObject
或File
个对象。相反,这些是由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)
时,会发生以下情况(假设您没有进行远程处理):
CLSID_foo
。 (特别是HKEY_CLASSES_ROOT \ CLSID \\ InprocServer32)。pUnkOuter
,IID_IFoo
和pFoo
来调用IClassFactory::CreateInstance的实施。在许多其他情况下,你将拥有不能直接创建的COM对象,正如@Ben所提到的那样。甚至还存在其他标准工厂接口,如IServiceProvider,以便类可以公开一组动态接口。