ATL サービス VC++2010 テンプレートに基づくプロセス外サーバーがあります。現在、独自の COM クラスを含む追加の dll を動的にロードして、彼の COM インターフェイスを拡張することはありません。ロードする dll は、単純な ATL オブジェクト「IMModule」を含む ATL dll VC++2010 テンプレートに基づいています。LocalServer セクションとサーバーの AppID を次のように追加して、対応する .rgs ファイルを変更し、クラスを 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 の 2 番目のパラメーター) を取得する方法がわかりません。私は次のことを試しました:
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 クライアントが利用できるようにする方法を教えてください。