質問

私は2つのjacobを使って奇妙な問題を抱えています。私は静的なActiveXObjectフィールドを使用して、WMIにさまざまな要求を送るために静的なクラスを使用しています。最初のスレッドはうまく機能します。2番目のスレッドが起動されると、次の例外が得られます。

com.jacob.com.ComFailException: Can't map name to dispid: ExecQuery
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:510)
at JacobWmiAdapter.getResultsList(JacobWmiAdapter.java:111)
at JacobWmiAdapter.getResultsList(JacobWmiAdapter.java:104)
at WindowsInfoCollector.getConnectionInfo(WindowsInfoCollector.java:516)
at WindowsInfoCollector.collect(WindowsInfoCollector.java:118)
at DiagnosisExecutor.execute(DiagnosisExecutor.java:128)
at DiagnosisExecutor.run(DiagnosisExecutor.java:160)
at java.lang.Thread.run(Thread.java:662)
.

スレッドはGUIからマウスクリックで開始されますが、エラーは手動で再現可能です。

        DiagnosisExecutor dex = new DiagnosisExecutor();
        Thread thread1 = new Thread(dex);
        Thread thread2 = new Thread(dex);

        thread1.start();
        thread1.join();
        Thread.sleep(1000);
        thread2.start();
.

それらを使用するスレッドが終了すると、割り当てられたリソースの中にはいくつかの割り当てられたリソースが正しくリリースされていないようです。任意のヒント?

更新:Jacobバージョン1.14.3

役に立ちましたか?

解決

Jacobの最新バージョンを使用していませんでした。バージョン1.7以降、基礎となるCOMコンポーネントをよりよく反映するためにスレッドモデルを改善しましたが、このコンポーネントがMTAまたはSTAであるかどうかを判断し、次にJACOBクラスを適切に初期化する必要があります。 Jacob Documentation その要件に従ってあなたのアプリケーションを正しく適応させる方法については、

他のヒント

私は同じスレッド名を複数のスレッドに設定し始めたときに、私は似たような問題を経験し始めました(最初の実行OK、オブジェクトはCo-Create Objectで失敗しました)。スレッド名へのサフィックスとしての連続番号を追加しました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top