使用Java/JaCoB让32位COM客户端与进程外64位服务器对话

使用Java/JaCoB让32位COM客户端与进程外64位服务器对话,java,com,matlab,jacob,out-of-process,Java,Com,Matlab,Jacob,Out Of Process,指示32位COM客户端可以与64位COM服务器对话(反之亦然),前提是服务器处于进程外。我正在尝试实现一个客户端,它使用javacombridge(JaCoB)库以这种方式与第三方进程外服务器进行通信,根据需要,这应该是可能的。如果我匹配流程架构(32位到32位或64位到64位),则我正在使用的测试代码将成功,但对于任何交叉组合,都会失败,出现以下异常: Exception in thread "main" com.jacob.com.ComFailException: A COM except

指示32位COM客户端可以与64位COM服务器对话(反之亦然),前提是服务器处于进程外。我正在尝试实现一个客户端,它使用javacombridge(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错误是。在一些网络挖掘之后,我发现一个可能的原因是一个无效的方法签名,下面是一些详细信息。COM服务器是MATLAB,我试图调用
Execute
Quit
方法。以下是他们的COM类型签名(来自OLEView):

BSTR\u stdcall Execute([in]BSTR Name)
void _stdcallquit()

这是我的测试代码:

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调用这些方法
或者,对于OLE嵌入

  • SWT通信桥
我以前曾与Jacob合作过,但它似乎非常不稳定(至少对于我不久前尝试过的ActiveX控件而言)