3

この質問は、サーバーがアウトプロセスである場合、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 を掘り下げた結果、考えられる原因は無効なメソッド シグネチャであることが判明したため、詳細を以下に示します。ExecuteCOM サーバーは 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();
}
4

1 に答える 1

1

私たちのアプリケーションでは現在、COM コントロール アクセスに Com4J を使用していますが、一部の ActiveX コントロールではディスパッチ関数の実装が不十分であることに気付きました (これを正しく理解していれば)。

  • Com4Jに直接アクセスする
  • COM コントロールが参照される COM コントロールへの VB6 ラッパー。ただし、呼び出すメソッドのラッパーを公開し、Com4J からそれらを呼び出す必要があります。

または、OLE 埋め込みの場合

  • SWT COM Brigde。

以前、Jacob と一緒に仕事をしたことがありますが、非常に不安定なようでした (少なくとも、少し前に試した ActiveX コントロールについては)。

于 2011-01-17T21:15:31.360 に答える