我们开发了一个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)
我们注意到同一代码在一次尝试中正常工作,在下次重启时失败。这种行为完全随机,因此很难追查。
注意事项:
我们在某处读过,JACOB Library 在多线程环境中行为不端。 这是真的吗?
如果是,应该做些什么才能使其按预期工作。 如果没有,那么为什么这个异常会被随机抛出?
任何想法/帮助/主角都很有用。提前谢谢!
答案 0 :(得分:0)
这不是针对这种特定情况的答案,因为无论如何这个问题已经很老了 - 但就因为我看到它没有得到解答并且我在我的一次搜索中看到了它,所以我想给出一些建议。
根据我自己的经验,如果您正确使用 JACOB 是可以的 - 所以它不能被称为“行为不端”。
在我的特定场景中,由于我使用 JACOB 来自动化 Microsoft Word,我们遇到的大部分问题都源于 Office not made to be automated 在后端、无窗口环境中。
>Link to a Microsoft article 关于 COM 自动化中的早期和晚期绑定
StackOverflow 上的其他相关线程是:
在上述主题之一中,他们提到了关于 JACOB 的 old archived article 以及他们建议如何在多线程环境中使用它。