java - JACOB 库在多线程中使用时失败

标签 java multithreading activex wmi jacob

我在两个随后启动的相同线程中使用 JACOB 时遇到了一个奇怪的问题。我有一个实用程序类,它使用静态 ActiveXObject 字段将各种请求分派(dispatch)到 WMI。第一个线程工作正常。当第二个线程启动时,我收到以下异常:

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 开始,他们改进了线程模型,以更好地反射(reflect)底层 COM 组件,但您必须确定所述组件是 MTA 还是 STA,然后适本地初始化 JACOB 类。引用JACOB documentation了解如何根据应用程序的要求正确调整应用程序。

关于java - JACOB 库在多线程中使用时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9684512/

相关文章:

windows - 用于在 Windows 中显示内存中 MHTML 的 ActiveX 组件

java - 重构方法时要选择什么方法,才能符合整洁代码的原则?

java - 无法在单独的线程中设置 SelectionKey 的interestOps

multithreading - 计算最小值的最短时间

c++ - 互斥体解锁时解除定时接收阻止

c# - 这可能与 activex 控件有关吗?

javascript - 使用查询小部件将 ActiveX 控件动态加载到页面上

java - Tesseract板检测

java - 为什么在 Java 中使用管道执行系统命令会在没有空格的情况下失败?

c - 使用条件变量的简单多线程堆栈实现