Delphi COM工厂错误0x80040154 CoCreateGuid(fIID); 创建(ComServer、TMyCustomComClass、fIID、aClassName、aClassName、ciInternal、tmpartment); fResult:=CoGetClassObject(fIID、CLSCTX_服务器、nil、IClassFactory、fFactory); 断言(fFactory nil,'错误!fFactory为nil..');//fResult~>0x80040154 REGDB_E_CLASSNOTREG

Delphi COM工厂错误0x80040154 CoCreateGuid(fIID); 创建(ComServer、TMyCustomComClass、fIID、aClassName、aClassName、ciInternal、tmpartment); fResult:=CoGetClassObject(fIID、CLSCTX_服务器、nil、IClassFactory、fFactory); 断言(fFactory nil,'错误!fFactory为nil..');//fResult~>0x80040154 REGDB_E_CLASSNOTREG,delphi,com,factory,Delphi,Com,Factory,TMyCustomComClass继承自TComObject 根据MSDN,发生此类错误的原因是CLSID不在注册表中,但根据Delphi的TComObjectFactory帮助,不需要注册表来执行此操作,而原始代码也执行了相同的操作并正常工作。 我遗漏了一些东西,但是什么?TComObjectFactory实例在注册到CoRegisterClassObjectAPI之前,Windows COM系统无法看到它。当您使用Delphi创建一个新的ActiveX库时-加载库时,将为库中存在的每个类工厂

TMyCustomComClass继承自TComObject

根据MSDN,发生此类错误的原因是CLSID不在注册表中,但根据Delphi的TComObjectFactory帮助,不需要注册表来执行此操作,而原始代码也执行了相同的操作并正常工作。

我遗漏了一些东西,但是什么?

TComObjectFactory
实例在注册到
CoRegisterClassObject
API之前,Windows COM系统无法看到它。当您使用Delphi创建一个新的ActiveX库时-加载库时,将为库中存在的每个类工厂调用此API,并调用它的
DllGetClassObject
方法

这是代码的修改版本,
TMyCustomComClass
COM对象将在创建它的进程中可见。通过这种方式,您可以注册仅在当前进程中可见的新COM对象,而无需在Windows注册表中注册它。例如,您可以在流程中使用WebBrowser控件内的fIID实例化此COM对象:

CoCreateGuid( fIID );
TComObjectFactory.Create( ComServer, TMyCustomComClass, fIID, aClassName, aClassName, ciInternal, tmApartment );
fResult := CoGetClassObject( fIID, CLSCTX_SERVER, nil, IClassFactory, fFactory );
assert( fFactory <> nil, 'ERROR! fFactory is nil..' ); // fResult ~> 0x80040154 REGDB_E_CLASSNOTREG
var
工厂:IClassFactory;
注册:朗吉特;
...
CoCreateGuid(fIID);
工厂:=TComObjectFactory.Create(ComServer、TMyCustomComClass、fIID、aClassName、aClassName、ciInternal、TMPartment);
CoreRegisterClassObject(fIID、Factory、CLSCTX\u INPROC\u处理程序、REGCLS\u MULTIPLEUSE、FReg);//此行在Windows中注册TComObjectFactory
fResult:=CoGetClassObject(fIID、CLSCTX_服务器、nil、IClassFactory、fFactory);
断言(fFactory nil,'ERROR!fFactory为nil..');

您能否编辑您的答案并添加指向此处引用的MSDN和Embarcadero帮助页面的链接?这将有助于我们消除混乱。是Microsoft COM函数,它使用标准COM注册(hense注册表,除非使用无注册COM),因此COM必须知道CLSID。要使此示例起作用,
TComObjectFactory.Create()
必须注册它所传递的CLSID。就我个人而言,我认为这是一个糟糕的例子,
CoGetClassObject()
是多余的,因为Delphi可以直接实例化
TMyCustomComClass
,而无需通过COM.REGDB\u E\u CLASSNOTREG非常清楚
CoGetClassObject
将在注册类对象后成功,而不仅仅是创建它。看起来是相关的,或者你想要其他方法来提供它(见上面的Remy)。
var
  Factory: IClassFactory;
  Reg: LongInt;
...
  CoCreateGuid( fIID );
  Factory := TComObjectFactory.Create( ComServer, TMyCustomComClass, fIID, aClassName, aClassName, ciInternal, tmApartment );
  CoRegisterClassObject(fIID, Factory, CLSCTX_INPROC_HANDLER, REGCLS_MULTIPLEUSE, FReg);  // This line registers TComObjectFactory in Windows
  fResult := CoGetClassObject( fIID, CLSCTX_SERVER, nil, IClassFactory, fFactory );
  assert( fFactory <> nil, 'ERROR! fFactory is nil..' );