java - 使用 Java/JaCoB 让 32 位 COM 客户端与进程外 64 位服务器通信

标签 java com matlab jacob out-of-process

This question表示 32 位 COM 客户端可以与 64 位 COM 服务器通信(反之亦然),前提是服务器处于进程外。我正在尝试使用 Java Com Bridge (JaCoB) 库实现一个客户端,以这种方式与第三方进程外服务器对话,根据 this question 这应该是可能的.如果我匹配进程架构(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,我正在尝试调用 ExecuteQuit 方法。以下是它们的 COM 类型签名(来自 OLEView):

BSTR _stdcall Execute([in] BSTR Name);
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 控件而言)。

关于java - 使用 Java/JaCoB 让 32 位 COM 客户端与进程外 64 位服务器通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4648943/

相关文章:

java - 在 Android 中的两个不同 Activity 中安全访问登录数据

matlab - 使用循环将元素添加到 MATLAB 中的现有向量

java - 在java中使用文件分隔符读取文件

java - 如果方法在使用 Powermock 进行单元测试期间调用,如何有效验证方法

java - 在 AWS Amazon 上自动执行 api

c# - 通过 Windows 进程句柄访问 COM 对象

c++ - 懂COM的静态分析工具?

matlab - Matlab Horzcat-内存不足

python - 相当于matplotlib中matlab的imagesc?