我有一个基于 ATL 服务 VC++2010 模板的进程外服务器。现在我不会通过动态加载包含自己的 COM 类的附加 dll 来扩展他的 COM 接口。要加载的 dll 基于 ATL dll VC++2010 模板,包含一个简单的 ATL 对象“IMModule”。我更改了相应的 .rgs 文件,通过添加 LocalServer 部分和服务器的 AppID 将类从 dll 连接到 EXE 服务器,如下所示:
HKCR
{
NoRemove CLSID
{
ForceRemove {59276614-A811-4D27-B131-514656E643D3} = s 'IMModule Class'
{
ForceRemove Programmable
LocalServer32 = s 'path to the service exe'
{
val ServerExecutable = s 'path to the service exe'
}
TypeLib = s '{250685C7-CBD3-4FF8-A3A6-2AF668794CFC}'
Version = s '1.0'
val AppID = s '{7EFD508A-53C6-4EA0-B21A-D29277B86CBC}'
}
}
}
在加载 dll 后由服务调用的 dll init() 方法中,我调用 CoRegisterClassObject 来注册 IMModule 类对象。但我不确定如何获取 IUnknown 接口指针( CoRegisterClassObject 的第二个参数)。我尝试了以下方法:
CIMModule::_ClassFactoryCreatorClass* pClassFak =
new CIMModule::_ClassFactoryCreatorClass;
IUnknown* pUnk;
HRESULT hr =
pClassFak->CreateInstance(CIMModule::_ClassFactoryCreatorClass::CreateInstance,
IID_IIMModule, (LPVOID*)&pUnk);
但是对 CreateInstance 的调用失败并显示 E_NOINTERFACE。那么,如何注册我在 dll 中实现的 IMModule 类,以便从我的进程外服务器可供 COM 客户端使用?