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

4
我有以下配置:
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上搜索了异常情况并进行了以下操作:

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

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

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

我已经单独完成了上述所有操作,检查了所有可能的组合。但使用64位Java时仍出现上述错误。

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

我有一个问题想问懂行的人:是否有任何方法可以连接一个只提供Win32 COM dll[1]的应用程序,使用任何可用的Java/COM桥接器和Java 64位?或者说,32位COM + 64位Java无法连接?

[1]:我检查了OLE/COM Viewer,在类型库下只有一个条目“0 Win32 =”,这意味着没有Win64 COM dll,对吗?

1个回答

4
这种情况不起作用,因为客户端进程和COM DLL的位数不匹配。在试图创建新实例时,CoCreateInstance尝试在64位注册表的相关类信息中查找。这会失败,因为实际上它位于32位注册表中,而您注册了DLL。
要解决这个问题,您可以选择使用代理进程,允许在一个独立的本地进程中实例化您的CoClass。然后,您的客户端可以通过IPC与代理进行通信(有关更多信息,请参见此处)。
作为快速入门,您可以将您的CoClass标记为默认的dllhost.exe代理进程候选项:OLE / COM对象查看器(x86)作为管理员 > 所有对象 > [Your CoClass] > 实施 > 使用代理进程(路径留空)。
如果您打算分发应用程序,可以将此信息放置在REG脚本中或将DLL导入COM+服务器应用程序中。

感谢您的回复。我已经执行了“作为快速入门,您可以将您的 CoClass 标记为默认的 dllhost.exe 代理进程的候选者:OLE/COM 对象查看器(x86)> 所有对象 > [您的 CoClass] > 实现 > 使用代理进程(将路径留空)。”但还是出现了相同的错误。我勾选了“使用代理进程”框,但当我导航到另一个 CoClass,然后返回我的 CoClass 时,该框未被选中。有没有可能我的选择没有保存? - Thanos
你以管理员身份运行了oleview吗?它需要相应的权限才能写入注册表。您可以通过切换到CoClass的Registry选项卡来验证设置是否正确保存。在AppID节点下应该可见一个[DllSurrogate]条目。 - Aurora
好的,我必须以管理员身份运行。现在已经保存并且可以从64位Java中运行。非常感谢您的帮助。 - Thanos
你能添加一个示例脚本或解释如何创建一个吗? - orirab
请查看此答案以获取示例。 - Aurora

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接