Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 其它 > 资料存档
资料存档 资料存档
回复
 
主题工具 显示模式
旧 2019-12-14, 20:38   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 使用Java / JaCoB获取32位COM客户端与进程外64位服务器进行对话

此问题表明,如果服务器不在进程内,则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嵌入
  • SWT COM旅。
我以前曾与Jacob合作,但它似乎非常不稳定(至少对于我一段时间前尝试过的ActiveX控件而言)。



更多&回答...
poster 当前离线   回复时引用此帖
回复

主题工具
显示模式

发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛禁用 表情符号
论坛启用 [IMG] 代码
论坛启用 HTML 代码



所有时间均为北京时间。现在的时间是 23:58


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.