使用Com4j或Jacob将64位Java与32位COM dll连接
我有以下配置:
1)Windows 10 64位
2)只有32位版本的应用程序可通过COM获得。
我使用tlbimb.jar访问32位应用程序的.dll文件,以生成所需的接口,然后成功。
方案1:我尝试使用Java 8 安装访问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上失败。
我对一个可能知道的人有一个疑问:据我所知,是否有任何方法可以使用任何可用的Java / COM桥和 [1]的应用程序?还是仅仅是32位COM + 64位Java无法连接? *
[1]:我检查了OLE / COM Viewer,并且在类型库下只有一个条目“ 0 Win32 =,所以我暗示这意味着没有Win64 COM dll,对吗?
回答:
这将不起作用,因为您的客户端进程和COM
DLL的位数不匹配。尝试创建新实例时,请CoCreateInstance
尝试在注册表的64位配置单元中查找相关的类信息。之所以失败,是因为它实际上位于您注册DLL的32位配置单元中。
为了解决这个问题,您可以选择使用替代过程,该过程使您的CoClass可以在不同的本机过程中实例化。然后,您的客户可以通过IPC与代理进行通信(有关更多信息,请参见此处)。
作为快速入门,您可以将CoClass标记为默认dllhost.exe
代理过程的候选者:OLE / COM对象查看器(x86)为Admin>所有对象>
[您的CoClass]>实现>使用代理过程(将路径保留为空)。
如果您打算分发您的应用程序,则可以将此信息放在REG脚本中或将DLL导入COM +服务器应用程序。
以上是 使用Com4j或Jacob将64位Java与32位COM dll连接 的全部内容, 来源链接: utcz.com/qa/416114.html