この質問は、サーバーがアウトプロセスである場合、32 ビット COM クライアントが 64 ビット COM サーバーと通信できること (およびその逆) が可能であることを示しています。Java Com Bridge (JaCoB) ライブラリを使用して、この方法でサードパーティのアウトプロセス サーバーと通信するクライアントを実装しようとしています。私が使用しているテスト コードは、プロセス アーキテクチャ (32 ビットから 32 ビット、または 64 ビットから 64 ビット) と一致する場合は成功しますが、次の例外を伴うクロス コンビネーションでは失敗します。
Exception in thread "main" com.jacob.com.ComFailException: A COM exception has been encountered:
At Invoke of: Execute
Description: Invalid callee.
at com.jacob.com.Dispatch.invokev(Native Method)
at com.jacob.com.Dispatch.invokev(Dispatch.java:858)
at com.jacob.com.Dispatch.callN(Dispatch.java:455)
at com.jacob.com.Dispatch.call(Dispatch.java:544)
at com.jacob.activeX.ActiveXComponent.invoke(ActiveXComponent.java:447)
...
何か案は?
アップデート
例外をデバッグした後、根本的な COM エラーはDISP_E_BADCALLEEであると確信しています。Web を掘り下げた結果、考えられる原因は無効なメソッド シグネチャであることが判明したため、詳細を以下に示します。Execute
COM サーバーは MATLAB で、 メソッドとメソッドを呼び出そうとしていQuit
ます。これらの COM タイプ シグネチャは次のとおりです (OLEView から)。
BSTR _stdcall Execute([in] BSTR 名);
void _stdcall Quit();
そして、ここに私のテストコードがあります:
public static void main(String[] args) {
ActiveXComponent ml = new ActiveXComponent("Matlab.Application.Single.7");
System.out.println(ml.invoke("Execute","version"));
ml.invoke("Quit");
ml.safeRelease();
}