【问题标题】:Connect 64bit Java with 32bit COM dll using Com4j or Jacob使用 Com4j 或 Jacob 连接 64 位 Java 和 32 位 COM dll
【发布时间】:2017-08-26 01:37:15
【问题描述】:

我有以下配置:

1) Windows 10 64 位

2) 只有 32 位版本且可通过 COM 获得的应用程序。

我使用 tlbimb.jar 访问 32 位应用程序的 .dll 文件以生成所需的接口,我成功了。

场景 1: 我尝试使用 Java 8 32-bit 安装访问 32 位应用程序。我可以通过 COM 调用方法成功没有任何问题。

场景 2: 我尝试使用 Java 8 64 位安装访问 32 位应用程序。我收到一条错误消息:

Exception in thread "main" com4j.ExecutionException: com4j.ComException: 80040154 CoCreateInstance failed : Class not registered : .\com4j.cpp:153

我在 Stackoverflow/Google 上搜索了异常,我做了以下操作:

1) 使用 Sys64WOW/regsvr32.exe 和 System32/regsvr32.exe 注册应用程序的 dll

2) 使用 Sys64WOW/regsvr32.exe 和 System32/regsvr32.exe 注册 com4j dll(32 位和 64 位)

3) 复制 Sys64WOW 和 System32 文件夹中的 dll。

我已经分别完成了以上所有操作,检查了所有可能的组合。上述使用 64 位 Java 的错误仍然存​​在。

我尝试过使用另一个网桥(Jacob)。在 32 位 Java 上成功,在 64 位 Java 上失败。

我有一个问题想问可能知道的人:有什么方法可以连接一个应用程序,据我所知,该应用程序仅提供 Win32 COM dll[1],使用任何可用的 Java/COM 桥和 Java 64bit?还是只是 32 位 COM + 64 位 Java 无法连接?

[1]:我检查了 OLE/COM 查看器,在类型库下只有一个条目 "0 Win32 = ,所以我暗示这意味着没有 Win64 COM dll,对吧?

【问题讨论】:

    标签: java com jacob com4j


    【解决方案1】:

    这不起作用,因为您的客户端进程和 COM DLL 的位数不匹配。在尝试创建新实例时,CoCreateInstance 尝试在注册表的 64 位配置单元中查找相关的类信息。这会失败,因为它实际上位于您注册 DLL 的 32 位配置单元中。

    要解决这个问题,您可以选择使用代理进程,它允许您的 CoClass 在不同的本地进程中实例化。然后,您的客户可以通过 IPC 与代理进行通信(请参阅here 了解更多信息)。

    作为快速入门,您可以将您的 CoClass 标记为默认 dllhost.exe 代理进程的候选者:OLE/COM Object Viewer (x86) as Admin > All Objects > [Your CoClass] > Implementation > Use Surrogate Process (将路径留空)。

    如果您打算分发您的应用程序,您可以将此信息放在 REG 脚本中或将您的 DLL 导入 COM+ 服务器应用程序。

    【讨论】:

    • 感谢您的回复。我这样做了“作为快速入门,您可以将您的 CoClass 标记为默认 dllhost.exe 代理进程的候选者:OLE/COM Object Viewer (x86) > All Objects > [Your CoClass] > Implementation > Use Surrogate Process (leave路径为空)。”但仍然是同样的错误。我勾选了 Use Surrogate Process 框,但是当我导航到另一个 CoClass 然后回到我的 CoClass 时,该框未选中。我的选择有没有可能没有保存?
    • 您是否以管理员身份运行 oleview?它需要相应的权限才能写入注册表。您可以通过切换到 CoClass 的注册表选项卡来验证设置是否正确保存。 AppID 节点下方应该有一个可见的 [DllSurrogate] 条目。
    • 好的,我必须以管理员身份运行。现在它被保存了,它可以在 64 位 Java 中运行。非常感谢。非常感谢您的帮助。
    • 你能添加一个示例脚本或解释如何创建一个吗?
    • this 回答为例。
    猜你喜欢
    • 2012-05-22
    • 1970-01-01
    • 2012-01-29
    • 2015-01-07
    • 2011-03-27
    • 1970-01-01
    • 2012-06-06
    • 2012-05-12
    • 1970-01-01
    相关资源
    最近更新 更多