2011-07-13 14 views
2

64ビット.NETアプリケーションで32ビットのアンマネージCOMサーバーを使用する必要があります。64ビット.NETアプリケーションで32ビットのアンマネージCOMサーバーを使用

私はいくつかの調査を行いましたが、COM +サーバーをCOM + サーバーアプリケーションでホストする適切なソリューションが見つかったようです。コンポーネントは専用(32ビット)プロセスでアクティブ化され、RPC経由で64ビットプロセスと通信します。 (link

上記をテストするために、サンプルのCOMサーバーを作成し、COM +アプリケーションに登録しました。そのインターフェイスは次のようになります。

interface ITestComObj: IUnknown 
{ 
    HRESULT _stdcall Ping(void); 
    HRESULT _stdcall Uppercase([in] LPSTR input, [out, retval] LPSTR * output); 
}; 

次に、これらのメソッドをCOM interop経由で呼び出す単純な.NETコンソールアプリケーションを作成しました。

まず、32ビットWinXPでテストしたところ、正常に動作しました。

その後、私は64ビットのWin7に移動しました。最初の呼び出し(パラメータなしのPing()メソッドへの)は成功しましたが、2番目の呼び出しは例外をスローしました(待機した後に):リモートプロシージャ呼び出しが失敗しました。 (HRESULTからの例外:0x800706BE)。

さらに調査を行った。私は何か変更があるかどうかを見るためにクライアントを32ビットプロセス(x86ターゲットプラットフォームに構築)にしましたが、結果は同じでした。しかし、インプロセスアクティベーション(COM +アプリケーションタイプをライブラリアプリケーションに変更)に切り替えると、クライアントが機能しました。

もちろん、クロスプロセスパラメータの渡し方はWin7では間違っていますが、何時間もグーグルグーグルでも答えが見つかりませんでした。

アイデア?

+0

? – sharptooth

+0

あなたはこの質問を見たことがありますか? http://stackoverflow.com/questions/3573523/issues-with-porting-com-applications-from-windows-2003-to-windows-2008-server – sharptooth

答えて

0

問題は整列化にあります。何らかの理由でinteropレイヤーが2番目の呼び出しパラメータを適切に整列化できません。私はarrays with size_is attributeを使用するように署名を変更することをお勧めします。

+0

それを試してみてください。すべて同じ... – luc

0

文字列型のマーシャリングに問題がある可能性があります。私が使用してみます:

HRESULT _stdcall Uppercase([in] BSTR input, [out, retval] BSTR * output); 

の代わりに、各配列の大きさは何

HRESULT _stdcall Uppercase([in] LPSTR input, [out, retval] LPSTR * output); 
関連する問題