当前位置: 首页 > 面试题库 >

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

孙清野
2023-03-14
问题内容

我有以下配置:

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上失败。

我对一个可能知道的人有一个疑问:据我所知,是否有任何方法可以使用任何可用的Java / COM桥和 Java 64bit* 连接仅提供 Win32
COM dll
[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 +服务器应用程序。



 类似资料:
  • 问题内容: 针对32位JDK构建和编译为32位字节代码的Java代码是否可以在64位JVM中工作?还是64位JVM需要64位字节代码? 为了提供更多细节,我有在运行32位JVM的Solaris环境中工作的代码,但是现在将JDK和Weblogic Server升级到64位后遇到了问题。 问题答案: 是的,假设您使用平台无关的库,则Java字节码(和源代码)是平台无关的。32与64位无关紧要。

  • 问题内容: 我正在创建一个非常简单的应用程序,该应用程序可以读取和显示文本文件并进行搜索。 我问自己是否有兴趣向用户提出32位和64位版本。 区别仅在于使用64位版本访问更多的内存堆大小,还是还有其他兴趣? 32位编译程序是否可以在64位JVM上运行(我认为是) 问题答案: 任何 程序的32位和64位版本之间的唯一区别是机器字的大小,可寻址内存的数量以及所使用的操作系统ABI。对于Java,语言规

  • 我真的对此感到困惑。 Xmx根据java文档,是允许的最大堆大小。 Xms是所需的最小java堆大小,在JVM启动时分配。 在32位JVM(4GB ram)上,java-xmx1536m HelloWorld会出现无法分配足够内存的错误。 在64位JVM(4GB ram)上,java-xmx20g HelloWorld可以正常工作。但我甚至没有分配那么多的虚拟或物理内存。 因此,我得出结论:Jav

  • 问题内容: 本机整数算术指令是否比其计数器部件慢(在装有OS的计算机上)? 编辑:在当前CPU上,例如Intel Core2 Duo,i5 / i7等。 问题答案: 这取决于确切的CPU和操作。例如,在64位Pentium IV上,64位寄存器的乘法要慢得多。Core 2和更高版本的CPU从一开始就设计用于64位操作。 通常,即使是为64位平台编写的代码也使用32位变量,其中的值将适合它们。这主要

  • 问题内容: 我已经下载了最新的com4j jars,并且试图通过它们中最简单的示例进行分析。 我使用的是Windows 7 64位,并使用64位JVM。 当我运行命令时(来自com4j教程): 我得到: Java代码在jar旁边提取“ com4j-amd64.dll”。 问题答案: 最新版本刚刚发布: http://kohsuke.org/2012/04/27/com4j-updates/ htt