0

JACOB を使用して COM オブジェクトと対話しようとしています。

オブジェクトで初期化メソッドを呼び出す (およびそのプロパティを取得する) ことはできましたが、イベントを取得できません。以下にコードを引用します。
同じオブジェクトからイベントを正常に受信するサンプル HTML+Javascript ページ (IE で実行) があります。
次のオプションを検討していますが、具体的なトラブルシューティングのアイデアをいただければ幸いです...

  • 私の Java プログラムを COM オブジェクトを開発したチームに送り、彼らの側で疑わしいものを探してもらいます (オブジェクトには、そのイベントをリッスンしているクライアントがいるかどうか、およびイベントが正常に配信されたかどうかを知る方法がありますか?)

  • JACOB のネイティブ部分に入り、その側でデバッグしてみてください。私の C++ は錆びていて、Windows 用にプログラミングしたことがないことを考えると、これは少し怖いことです。

public static void main(String[] args) {
    試す {
        ActiveXComponent c = 新しい ActiveXComponent(
                              "CLSID:{********-****-****-****-************}"); // オブジェクトの clsid
        if (c != null) {
            System.out.println("バージョン:"+c.getProperty("バージョン"));
            InvocationProxy プロキシ = 新しい InvocationProxy() {                 
                @オーバーライド
                public Variant invoke(String methodName, Variant[] targetParameters) {
                    System.out.println("*** イベント ***: " + メソッド名);
                    null を返します。
                }
            };
            DispatchEvents de = new DispatchEvents((Dispatch) c.getObject(), proxy);
            c.invoke("Init", new Variant[] {
                    new Variant(10), //param1
                    new Variant(2), //param2
                     });
            System.out.println("イベントを待っています...");
            Thread.sleep(60000); // 60 秒で十分です
            System.out.println("クリーンアップ中 ...");
            c.safeRelease();
        }
    キャッチ(例外e){
        e.printStackTrace();
    } 最後に {
        ComThread.Release();
    }
}
4

2 に答える 2

1

イベントの取得をトラブルシューティングする簡単な方法は、 java をオプションで実行して、Jacob デバッグを有効にすることcom.jacob.debug=trueです。

java -Dcom.jacob.debug=true ...

受信したすべてのイベントは、標準エラー (または出力) に表示されます。

Thread-0: InvocationProxy: trying to invoke Change on Sink@882c01f
Thread-0: InvocationProxy: listener (Sink@882c01f) doesn't implement Change
于 2012-10-13T08:43:27.110 に答える
1

これが私の特定の問題の解決策です:

COM オブジェクトは、ウィンドウのコンテキストで実行されていることを前提とした非表示の ActiveX コントロールとして記述されていることが判明しました。これは、JACOB ベースのプログラムをコンポーネントの開発チームに提供した後で、コンポーネントの開発チームによって「発見」されました。

ウィンドウ コンテキストの提供は、JACOB では行わないようです。

この場合の解決策は、COM を取り除くことです (そして、JNA を使用してネイティブ DLL 内の C 関数を直接呼び出します)。

于 2010-05-07T11:05:19.677 に答える