使用Java/jacob,让32位COM客户端与可启动的64位服务器交谈
-
09-10-2019 - |
题
这个问题 表明32位COM客户端可以与64位COM服务器(和Vice-vices-a)交谈,前提是服务器不在处理之外。我正在尝试使用Java Com Bridge(JACOB)库实现客户端,以这种方式与第三方进行交谈,应根据该服务 这个问题. 。如果我匹配过程架构(32位至32位或64位至64位),我正在使用的测试代码将获得成功,但是对于任何交叉组合,都会失败,但此例外:
Exception in thread "main" com.jacob.com.ComFailException: A COM exception has been encountered:
At Invoke of: Execute
Description: Invalid callee.
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:447)
...
有任何想法吗?
更新
调试例外后,我很确定基本的com错误是 disp_e_badcallee. 。经过一些网络挖掘后,我发现可能的原因是无效的方法签名,因此这里有更多细节。 com服务器是matlab,我正在尝试调用 Execute
和 Quit
方法。这是他们的COM类型签名(来自Oleview):
BSTR _STDCALL执行([in] BSTR名称);
void _stdcall Quit();
这是我的测试代码:
public static void main(String[] args) {
ActiveXComponent ml = new ActiveXComponent("Matlab.Application.Single.7");
System.out.println(ml.invoke("Execute","version"));
ml.invoke("Quit");
ml.safeRelease();
}
解决方案
在我们的应用程序中,我们目前使用COM4J进行COM控件访问,但是我们注意到某些ActiveX控件实现了不良的调度功能(如果我正确理解了此功能),因此,如果使用:我们必须为每个控件选择:
- com4j直接访问它
- 引用com控件的vb6包装器,其中引用了com控件,但我们必须将包装器揭露我们所调用的方法,并调用com4j
或者,用于嵌入
- SWT COM BRIGDE。
我以前曾与雅各布(Jacob)合作,但似乎非常不稳定(至少对于我之前尝试过的ActiveX控件)。
不隶属于 StackOverflow