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

我有以下配置:

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 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 +服务器应用程序。