java - 使用 Com4j 或 Jacob 连接 64 位 Java 和 32 位 COM dll

标签 java com jacob com4j

我有以下配置:

1) Windows 10 64 位

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

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

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

场景二:
我尝试使用 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 64 位 ?或者只是无法连接 32 位 COM + 64 位 Java?

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

最佳答案

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

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

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

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

关于java - 使用 Com4j 或 Jacob 连接 64 位 Java 和 32 位 COM dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43146476/

相关文章:

.net - 需要使用 .NET 支持复制 IDispatch*;不知道类(class)名称

python - 与 COM (python) 的 MSMQ 事务?

C# COM 组件在加载到非托管 C++ 应用程序时无法读取配置

java - 如何在 Java 中配置 .dll 文件?

java - Kotlin: Unresolved reference :javaClass

Java 使用实例方法而不是类/静态方法为每个实例化对象创建唯一 ID

java - 在 Hibernate 中保存实体后更新 OneToMany 列表

java - 将文本数据存储在一个/多个文件中以使其可用于各种平台的最佳方法是什么?

java - JACOB (Java/COM/ActiveX) - 如何解决事件处理问题?

java - JACOB 和 64 位 JVM - 它有效吗?