使用Com4j或Jacob

时间:2017-03-31 17:28:15

标签: java com jacob com4j

我有以下配置:

1)Windows 10 64位

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

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

场景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上搜索了exceptin,我完成了以下操作:

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的错误仍然存​​在。

我尝试过使用另一座桥(雅各布)。在32位Java上它成功了,在64位Java上失败了。

我有一个问题可能有人知道:有没有办法连接一个应用程序,据我所知,只提供 Win32 COM dll [1],使用任何一个可用的Java / COM桥和 Java 64bit ?或者只是32位COM + 64位Java无法连接?

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

1 个答案:

答案 0 :(得分:2)

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

要解决此问题,您可以选择使用代理进程,该进程允许在不同的本机进程中实例化CoClass。然后,您的客户可以通过IPC与代理进行通信(有关详细信息,请参阅here)。

作为快速入门,您可以将CoClass标记为默认dllhost.exe代理进程的候选者:OLE / COM对象查看器(x86)作为Admin>所有对象> [你的同类]>实施>使用代理流程(保留路径为空)。

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