3

既存のネイティブ C++ ATL インプロセス COM サーバーを強制的に別のプロセスにしようとしています。COM サーバーを変更せずに、DCOM がこれを実行してくれることを願っています。

通常のレジストリ設定から始めました。HKCR\CLSID{classId} エントリと、.dll ファイルへのパスを指定する InProcServer32 キーがあります。

アプリケーション ID (GUID) を生成し、あちこちに追加しました。具体的には、アプリケーション ID と等しい HKCR\CLSID{classId} の下に文字列値「AppId」を追加しました。また、HKCR\AppId{applicationId} キーと、空の文字列に等しい文字列値「DllSurrogate」を追加しました。COM サーバーをデフォルトのシステム提供のサロゲートに強制するには、これで十分だと思いました。

DCOM アプリケーションが DCOM 構成コンソールに表示されます。CoCreateInstance()ただし、またはを呼び出しCoGetClassObject()てクラスIDを指定すると、CLSCTX_LOCAL_SERVER「クラスが登録されていません」が返されます。私は何を間違っていますか?

UPD: 解決済み。実行した手順は、何らかの理由で InProcServer32 キーの下に同じパスを持つ間違ったクラス ID のレジストリを編集していたことを除いて、それを機能させるのに十分でした-おそらくそれは COM 地獄の問題でした.

4

3 に答える 3

2

チェックリストに従ってください

  1. レジストリの CLSID キーの下に指定された AppID 値と、対応する AppID キーが必要です。(チェックあり)
  2. アクティベーション コールでは、CLSCTX_LOCAL_SERVERビットが設定され、CLSID キーは LocalServer32、LocalServer、または LocalService を指定しません。(チェックあり)
  3. CLSID キーには、InprocServer32 サブキーが含まれています。(チェックあり)
  4. InprocServer32 キーで指定されたプロキシ/スタブ DLL が存在します。???
  5. DllSurrogate 値は AppID キーの下に存在します。(チェックあり)
于 2009-11-10T09:08:31.043 に答える
2

レジストリ キーが間違っています。HKCR\CLSID{classId} に InProcServer32 ではなく、LocalServer32 を設定する必要があります。

ただし、Windows は DLL をインスタンス化できません。したがって、プログラムを完全な COM サーバー exe に変更する必要があります。Windows が EXE を起動し、引数 /embedding を送信します。その後、CComModule を作成し、プログラムを開始できます。

于 2009-11-10T08:44:45.007 に答える
0

これが DLLHOST.EXE の目的ではないでしょうか。

于 2009-11-10T09:13:16.387 に答える