![]() |
使用Java / JaCoB获取32位COM客户端与进程外64位服务器进行对话
[URL="https://stackoverflow.com/questions/3148039/com-client-server-cross-64-32-bit-processes"]此问题[/URL]表明,如果服务器不在进程内,则32位COM客户端有可能与64位COM服务器通信(反之亦然)。我正在尝试使用Java Com Bridge(JaCoB)库来实现一个客户端,以这种方式与第三方进程外服务器进行通信,根据[URL="https://stackoverflow.com/questions/359807/how-do-i-use-a-32-bit-com-object-from-a-64-bit-process"]这个问题[/URL] ,这应该是可能的。如果我匹配流程体系结构(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) ... 有任何想法吗? [B]更新资料[/B] 在调试异常之后,我可以肯定地确定潜在的COM错误是[URL="http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.vsconstants.disp_e_badcallee.aspx"]DISP_E_BADCALLEE[/URL] 。经过一番网络挖掘后,我发现一个可能的原因是无效的方法签名,因此这里有更多详细信息。 COM服务器是MATLAB,我正在尝试调用Execute和Quit方法。这是它们的COM类型签名(来自OLEView): [INDENT] BSTR _stdcall Execute([in] BSTR名称); void _stdcall Quit(); [/INDENT]这是我的测试代码: 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(); } [B]回答:[/B] 在我们的应用程序中,我们当前使用Com4J进行COM控件访问,但是我们注意到某些ActiveX控件的实现调度功能执行得很差(如果我正确理解的话),因此如果使用以下命令,则必须为每个控件进行选择: [LIST][*] Com4J直接访问它[*] COM控件的VB6包装器,其中引用了COM控件,但是我们必须公开所调用方法的包装器,并从Com4J调用这些方法[/LIST]或者,用于OLE嵌入 [LIST][*] SWT COM旅。[/LIST]我以前曾与Jacob合作,但它似乎非常不稳定(至少对于我一段时间前尝试过的ActiveX控件而言)。 [url=https://stackoverflow.com/questions/4648943]更多&回答...[/url] |
所有时间均为北京时间。现在的时间是 23:48。 |
Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.