此问题表明,如果服务器不在进程内,则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和Quit方法。这是它们的COM类型签名(来自OLEView):
BSTR _stdcall Execute([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调用这些方法
或者,用于OLE嵌入
我以前曾与Jacob合作,但它似乎非常不稳定(至少对于我一段时间前尝试过的ActiveX控件而言)。
更多&回答...