COM类而无法实例化

COM类而无法实例化,com,Com,MSDN: “您为提供实例化的每个(COM)对象类实现一个IClassFactory接口。” 创建没有类工厂的COM类有用吗?IClassFactory用于调用方直接实例化的对象,例如使用CreateObject或CoCreateInstance,或GetObject 通过从创建的对象间接获取其他对象,可以获得这些对象 例如,VB或VBScript中的Scripting.FileSystemObject是直接创建的。您可以使用这些方法获取无法直接创建的文件或文件夹对象。而是由FileSystem

MSDN:

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


创建没有类工厂的COM类有用吗?

IClassFactory用于调用方直接实例化的对象,例如使用
CreateObject
CoCreateInstance
,或
GetObject

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

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

创建没有类工厂的COM类有用吗

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


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

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

特别是,当有人调用
CoCreateInstance(CLSID\u foo、pUnkOuter、CLSCTX\u INPROC、IID\u IFoo、(void**)和pFoo)
时,会发生以下情况(假设您没有进行远程处理):

  • COM在注册表中查找
    CLSID\u foo
    。(特别是HKEY\U CLASSES\U ROOT\CLSID\\InprocServer32)
  • COM加载该DLL并使用IID_IClassFactory调用
  • DLL返回指向的实现的函数指针
  • COM使用
    pUnkOuter
    IID\u IFoo
    pFoo
    调用您的实现

  • 正如@Ben所提到的,还有许多其他情况下,您可能会拥有不可直接创建的COM对象。甚至还有其他标准的工厂接口,比如,它们的存在使得类可以公开一组动态接口。

    我不知道。为什么不是或者为什么是。这是一个问题。这并没有告诉你我是否在抱怨什么。我要深入了解事实。谢谢你的回答。如果你在地面上建造所有的东西,你不需要一个类工厂,那么你可能想跳过它。标准框架和库通常为您提供默认的类工厂实现,而且在您的类上使用它既便宜又容易,您可能需要一个特定的罕见理由来拒绝提供给您的默认标准类工厂。好吧,正如我所理解的,自定义分解有一些罕见的好处。因此,COM对象有某种层次结构。就OOP而言,这就像“继承”。好榜样@未处理的异常,与继承不同。您创建的对象可以作为其他对象的工厂,也可以从函数返回。IClassFactory的目的是充当您直接创建的对象的标准工厂。这是一种方便——本质上是“如果您想让CreateObject/CoCreateInstance工作,您可以做的事情”。