結果的に2つの同じスレッドからJACOBを使用すると奇妙な問題が発生します。私は、WMIにさまざまな要求をディスパッチするための静的ActiveXObjectフィールドを使用するユーティリティクラスを持っています。最初のスレッドは正常に動作します。スレッドはGUIからマウスクリックによって開始されたが、エラーが手動で再現性のある複数のスレッドで使用するとJACOBライブラリが失敗する
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)
:
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
私の解決策:ComThread.Release()を使用してリソースを解放する単純なアプローチが機能しなかったため、静的な方法でJACOBユーティリティクラスを使用してインスタンスのメソッドを呼び出すようになりました。したがって、メインのActiveXObjectも内部的に再インスタンス化されています。おそらく、これはCOM層の腸の中にいくつかの漏れを引き起こしますが、私は本当に気にしない実用的な人です。この操作は1セッションにつき2回、最大3回と呼ばれ、COMインターフェイス実装の黒い魔法を調べるよりもむしろそのような問題を閉じるでしょう。 –