-1

MSDN:

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

在没有类工厂的情况下创建 COM 类有用吗?

4

3 回答 3

4

IClassFactory 是为调用者直接实例化的对象提供的,例如使用CreateObjector CoCreateInstance, or GetObject

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

例如,Scripting.FileSystemObject在 VB 或 VBScript 中是直接创建的。可以使用方法获取FileFolder对象,不能直接创建。相反,它们由 FileSystemObject 创建并从 FileSystemObject 方法返回。

于 2013-10-03T08:18:14.783 回答
1

在没有类工厂的情况下创建 COM 类有用吗?

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

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

于 2013-10-03T08:21:08.727 回答
0

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

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

  1. CLSID_fooCOM在注册表中查找。(特别是 HKEY_CLASSES_ROOT\CLSID\\InprocServer32)。
  2. COM 加载该 DLL 并使用 IID_IClassFactory调用DllGetClassObject 。
  3. 您的 DLL 返回一个指向IClassFactory实现的函数指针。
  4. COM使用、和调用您的IClassFactory::CreateInstance实现。pUnkOuterIID_IFoopFoo

正如@Ben 所提到的,在许多其他情况下,您将拥有无法直接创建的 COM 对象。甚至还存在其他标准工厂接口,例如IServiceProvider,以便类可以公开一组动态接口。

于 2013-10-05T04:04:23.607 回答