【发布时间】: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)
我们设法注意到相同的代码在一次尝试中运行良好,但在下次重新启动时失败。这种行为是完全随机的,因此难以追踪。
注意事项:
- fetchData 函数存在,双方签名完全相同。
- 代码在某一时刻运行良好,但在重新启动后出现异常。
我们在某处读到,JACOB 库在多线程环境中行为不端。 这是真的吗?
如果是,应该怎么做才能使其按预期工作。 如果不是,那为什么会随机抛出这个异常?
任何想法/帮助/引导都是有用的。提前致谢!
【问题讨论】:
标签: java c++ com activexobject jacob