1

Visual C++ 6.0 を使用して、ATL ベースの .EXE サーバーを作成しました。(レガシーコードを扱っているためVC6、プロセス外のコンテキストで操作をテストする必要があるため.exeサーバー、現在.exeサーバーは基本的に操作なしです)

対応するプロキシ スタブ DLL をビルドして登録しました。

私はクライアントアプリを持っています

  1. サーバー オブジェクトで FinalConstruct を呼び出して成功する IUnknown の CoCreateInstance (したがって、サーバーは正しく呼び出されます)
  2. 返された IUnknown インターフェイスの OleRun が成功する
  3. サーバー オブジェクトの IUnknown ポインターの QueryInterface が IMarshall インターフェイスのエラー コード 0x8000402 (そのようなインターフェイスはサポートされていません) で失敗する

これらの手順は (comip.h::CreateInstance) からコピーされました。

問題は、proxystub dll が呼び出されていないことにあるようです (IDE のモジュール リストにも、デバッグ ウィンドウのロード済みモジュール リストにも表示されません)。

私のクラスとインターフェイスの OleCom オブジェクト ビューアーは、https://skydrive.live.com/redir?resid=AE43106917EBD9E1!191&authkey=!AIOWeS5P3o2mlpw で確認できます

8891..ca4d は、オブジェクトのクラス インターフェイス ID です。

A298...420c はサーバー オブジェクトのインターフェイス ID です (IDispatch ベース)

あらゆる支援のためのTIA

4

1 に答える 1

0

問題は、IRunnableObjectインターフェイスを実装しているコンポーネントが実行中のオブジェクトテーブルに登録されていないことである可能性があります。これは、CoCreateInstance自体が成功することを意味しますが、CoCreateInstanceが呼び出したオブジェクトの場合、RPCコードはそれを見つけることができません。

このMSDNページは次のことを示しています:http: //msdn.microsoft.com/en-us/library/windows/desktop/ms694517 (v = vs.85).aspx

    Notes to Implementers
    The object should register in the running object table if it has a 
    moniker assigned. The object should not hold any strong locks on itself; 
    instead, it should remain in the unstable, unlocked state. The object 
    should be locked when the first external connection is made to the object.

なぜIMarshallインターフェースも使用しているのか少し心配です。通常、カスタムマーシャリングコードを作成する必要はないため、このインターフェイスを使用する必要はありません。

カスタムインターフェイスを参照しない限り、ole32.dllまたはoleauto32.dllのデフォルトのマーシャラーが使用されます。これが、プロキシがロードされていない理由である可能性が最も高いです。

    In the case of most COM interfaces, the proxies and stubs for standard 
    marshaling are in-process component objects which are loaded from a 
    systemwide DLL provided by COM in Ole32.dll.

http://msdn.microsoft.com/en-us/library/windows/desktop/ms692621(v=vs.85).aspx

于 2012-05-29T00:07:03.953 に答える