这个问题表明 32 位 COM 客户端可以与 64 位 COM 服务器通信(反之亦然),前提是服务器处于进程外。我正在尝试使用 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
andQuit
方法。以下是他们的 COM 类型签名(来自 OLEView):
BSTR _stdcall Execute([in] BSTR Name);
无效 _stdcall 退出();
这是我的测试代码:
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();
}