com.jacob.com.ComFailException:无法将名称映射到dispid。随机失败

时间:2017-10-09 10:25:14

标签: java c++ com activexobject jacob

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

简介:

启动时,创建一个activeXcomponent并调用该对象的Connect方法。 Connect方法通过引用返回类的实例(在COM对象中写入),此处称为“handle”

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);

问题陈述:

现在,在本地环境中进行测试时,我们发现everthing正常工作正常,并且不会抛出任何异常。但是在客户环境中,我们遇到以下错误:

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. 代码在某一点运行良好,重启后行为不端。
  3. 我们在某处读过,JACOB Library 在多线程环境中行为不端这是真的吗?

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

    任何想法/帮助/主角都很有用。提前谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

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

>

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

StackOverflow 上的其他相关线程是:

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