COM出厂错误0x80040154

时间:2015-01-14 22:31:17

标签: delphi com factory

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

TMyCustomComClass继承自TComObject。

根据MSDN,出现这样的错误是因为CLSID不在注册表中,但是通过Delphi的TComObjectFactory帮助,不需要注册表来执行此操作,并且原始代码执行相同的操作。 我错过了什么,但是什么?

1 个答案:

答案 0 :(得分:0)

在使用TComObjectFactory API注册之前,Windows COM系统无法看到

CoRegisterClassObject实例。当您使用Delphi创建新的ActiveX库时 - 在加载库并调用它的DllGetClassObject方法时,将为库中的每个类工厂调用此API。

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

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..' );