使用 Com4j 或 Jacob 将 64 位 Java 与 32 位 COM dll 连接



我有以下配置:

1) 视窗 10 64 位

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

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

场景 1: 我尝试使用 Java 8 32 位安装访问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 注册应用程序的 dll.exe

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

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

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

我尝试使用另一座桥(雅各布)。在 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。然后,您的客户可以通过IPC与代理人进行通信(有关更多信息,请参见此处)。

作为快速入门,您可以将 CoClass 标记为默认dllhost.exe代理进程的候选项:OLE/COM 对象查看器 (x86) 作为管理员> [您的 CoClass]>实现>"使用代理进程">所有对象(将路径留空)。

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

最新更新