【问题标题】:com.jacob.com.ComFailException: Can't map name to dispid. Random failurescom.jacob.com.ComFailException:无法将名称映射到 dispid。随机故障
【发布时间】:2021-08-04 16:00:36
【问题描述】:

我们开发了一个 COM 对象,它是一个 .exe 文件并在后台作为服务运行。我们正在尝试使用 JACOB 连接到对象。

简介:

在启动时创建一个activeXcomponent 并调用对象的Connect 方法。 Connect 方法通过引用返回类的实例(写在 COM 对象内部),这里称为“句柄”

component=new ActiveXComponent("ServiceName.className");
Dispatch.call(component,FN_CONNECT,sourceType,additionalParams,handle);

此句柄存储在类级别变量中。此 JAVA 类的实例存储在连接池中,稍后用于将来的函数调用。这是为了确保在已经初始化的对象/指针上调用下一个调用。

当要发起数据获取调用时,它会调用另一个名为 fetchData 的方法,并将请求作为输入。它通过引用返回错误代码和响应。组件对象通过存储在连接池中的 JAVA 类的实例来引用

Variant response = new Variant("", true);   //String
Variant errorCode = new Variant(0, true);
Dispatch.call(component,FETCH_DATA,handle,functionCode,request,response,errorCode);

问题陈述:

现在,在本地环境中进行测试时,我们发现一切正常,并且没有抛出异常。但是在客户端环境中,我们收到以下错误:

Caused by: com.jacob.com.ComFailException: Can't map name to dispid: fetchData 
at com.jacob.com.Dispatch.invokev(Native Method)
at com.jacob.com.Dispatch.invokev(Dispatch.java:625)
at com.jacob.com.Dispatch.callN(Dispatch.java:453)
at com.jacob.com.Dispatch.call(Dispatch.java:541)

我们设法注意到相同的代码在一次尝试中运行良好,但在下次重新启动时失败。这种行为是完全随机的,因此难以追踪。

注意事项:

  1. fetchData 函数存在,双方签名完全相同。
  2. 代码在某一时刻运行良好,但在重新启动后出现异常。

我们在某处读到,JACOB 库在多线程环境中行为不端这是真的吗?

如果是,应该怎么做才能使其按预期工作。 如果不是,那为什么会随机抛出这个异常?

任何想法/帮助/引导都是有用的。提前致谢!

【问题讨论】:

    标签: java c++ com activexobject jacob


    【解决方案1】:

    这不是针对这种特定情况的答案,因为无论如何这个问题已经很老了 - 但只是因为我看到它没有答案并且我在我的一次搜索中看到它,所以我想提供一些指示。

    根据我自己的经验,正确使用 JACOB 是没问题的 - 所以它不能被称为“行为不端”。

    再次,在我的特定场景中,由于我使用 JACOB 来自动化 Microsoft Word,我们遇到的大部分问题都源于 Office 在后端、无窗口环境中的 not made to be automated

    Link to a Microsoft article 关于 COM 自动化中的早期和晚期绑定

    StackOverflow 上的其他相关主题有:

    在上述线程之一中,他们提到了关于 JACOB 的 old archived article 以及他们建议如何在多线程环境中使用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-05
      • 1970-01-01
      • 1970-01-01
      • 2012-11-03
      • 2018-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多