COM出厂错误0x80040154

问题描述 投票:1回答:1
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帮助,不需要注册表来执行此操作,并且原始代码也做了同样的工作。 我错过了什么,但是什么?

delphi com factory
1个回答
0
投票

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

这是您的代码的修改版本,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..' ); 
© www.soinside.com 2019 - 2024. All rights reserved.