COM类而无法实例化
MSDN: “您为提供实例化的每个(COM)对象类实现一个IClassFactory接口。”COM类而无法实例化,com,Com,MSDN: “您为提供实例化的每个(COM)对象类实现一个IClassFactory接口。” 创建没有类工厂的COM类有用吗?IClassFactory用于调用方直接实例化的对象,例如使用CreateObject或CoCreateInstance,或GetObject 通过从创建的对象间接获取其他对象,可以获得这些对象 例如,VB或VBScript中的Scripting.FileSystemObject是直接创建的。您可以使用这些方法获取无法直接创建的文件或文件夹对象。而是由FileSystem
创建没有类工厂的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)
时,会发生以下情况(假设您没有进行远程处理):
CLSID\u foo
。(特别是HKEY\U CLASSES\U ROOT\CLSID\\InprocServer32)pUnkOuter
、IID\u IFoo
和pFoo
调用您的实现正如@Ben所提到的,还有许多其他情况下,您可能会拥有不可直接创建的COM对象。甚至还有其他标准的工厂接口,比如,它们的存在使得类可以公开一组动态接口。我不知道。为什么不是或者为什么是。这是一个问题。这并没有告诉你我是否在抱怨什么。我要深入了解事实。谢谢你的回答。如果你在地面上建造所有的东西,你不需要一个类工厂,那么你可能想跳过它。标准框架和库通常为您提供默认的类工厂实现,而且在您的类上使用它既便宜又容易,您可能需要一个特定的罕见理由来拒绝提供给您的默认标准类工厂。好吧,正如我所理解的,自定义分解有一些罕见的好处。因此,COM对象有某种层次结构。就OOP而言,这就像“继承”。好榜样@未处理的异常,与继承不同。您创建的对象可以作为其他对象的工厂,也可以从函数返回。IClassFactory的目的是充当您直接创建的对象的标准工厂。这是一种方便——本质上是“如果您想让CreateObject/CoCreateInstance工作,您可以做的事情”。