문제

Jacob을 사용하여 두 번의이므로 동일한 스레드를 사용하여 이상한 문제가 있습니다.다양한 요청을 WMI에 전달하기 위해 정적 ActiveXObject 필드를 사용하는 유틸리티 클래스가 있습니다.첫 번째 스레드는 잘 작동합니다.두 번째 스레드가 시작되면 다음 예외가 발생합니다.

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 문서 요구 사항에 따라 신청서를 올바르게 적용하는 방법은

다른 팁

비슷한 문제를 경험하기 시작했습니다 (첫 번째 실행 확인, 객체를 공동 만들 수 없음). 여러 스레드 이름을 여러 스레드로 설정하기 시작했습니다.스레드 이름에 대한 접미사로 순차 번호 추가 나를 위해 문제가 해결되었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top