Java 未能执行COM类:com4j.ComException:80040154 CoCreateInstance失败:未注册的类:。\com4j.cpp:153

Java 未能执行COM类:com4j.ComException:80040154 CoCreateInstance失败:未注册的类:。\com4j.cpp:153,java,dll,comm,com4j,Java,Dll,Comm,Com4j,几天来,我一直试图从JAVA应用程序执行一个“.dll”文件。如果您感兴趣,可以阅读我的第一个问题: 我使用“com4j”为我的DLL创建COM类。生成的类看起来不错,我尝试执行代码,更确切地说是一个名为“getUnitInfo”的方法,位于名为“_Tester”的类中: 我在互联网上读了很多关于这个问题的帖子,但没有任何帮助。 使用“PE解构”工具找出我需要执行的.dll文件是基于32位的。我有一个64位的Windows操作系统,但我安装了一个32位的JAVA和Eclipse 如果我在命令行中

几天来,我一直试图从JAVA应用程序执行一个“.dll”文件。如果您感兴趣,可以阅读我的第一个问题:

我使用“com4j”为我的DLL创建COM类。生成的类看起来不错,我尝试执行代码,更确切地说是一个名为“getUnitInfo”的方法,位于名为“_Tester”的类中:

我在互联网上读了很多关于这个问题的帖子,但没有任何帮助。 使用“PE解构”工具找出我需要执行的.dll文件是基于32位的。我有一个64位的Windows操作系统,但我安装了一个32位的JAVA和Eclipse

如果我在命令行中执行“java-version”:

java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) Client VM (build 25.171-b11, mixed mode)
com4j文档缺少信息,我认为新生成的JAva代码仍然需要与旧的DLL通信,但我不知道如何引用它

有人能帮忙吗

编辑 正在使用此UUID创建实例:

 public static DLL._Tester createTester() {
    return COM4J.createInstance( DLL._Tester.class, "{4B7CF2DB-F936-4BA3-9DC6-5E99E5220270}" );
  }
我在Windows注册表中找到了:
CoCreateInstance失败:类未注册
表示您提供的GUID与Windows注册表中的任何COM项都不匹配

您可以尝试加载具有不同GUID的COM对象-进入系统注册表并找到任何有效的GUID,可能是与Microsoft Excel关联的GUID(在我的情况下,该项位于
Computer\HKEY\u CLASSES\u ROOT\Excel.Application\CLSID
下)

要注册DLL,可能会有所帮助

编辑
Computer\HKEY\u LOCAL\u MACHINE\SOFTWARE\Classes\CLSID
下检查注册表。
您的GUID是否列在“类”下?

CoCreateInstance失败:类未注册
表示您提供的GUID与Windows注册表中的任何COM项都不匹配

您可以尝试加载具有不同GUID的COM对象-进入系统注册表并找到任何有效的GUID,可能是与Microsoft Excel关联的GUID(在我的情况下,该项位于
Computer\HKEY\u CLASSES\u ROOT\Excel.Application\CLSID
下)

要注册DLL,可能会有所帮助

编辑
Computer\HKEY\u LOCAL\u MACHINE\SOFTWARE\Classes\CLSID
下检查注册表。
您的GUID是否列在“类”下?

您好,一个月前我遇到了同样的问题,我找到的解决问题的最终解决方案是将java 64位更改为32位,它开始工作。 注意-只在构建路径中添加com4j.jar,不注册任何.dll文件


希望这对你有用一个月前我也遇到过同样的问题,解决我的问题的最终解决方案是将java 64位更改为32位,并开始工作。 注意-只在构建路径中添加com4j.jar,不注册任何.dll文件


希望这对你有用

谢谢你的回答!我查了一下注册表。请查看我问题的“编辑”部分。谢谢!!!你让我走上了正确的道路来解决这个问题。我必须注册.dll。这有助于Liam从你的链接中得到回应:很高兴听到这个。出于好奇,那么您如何能够从com4j调用这两个方法呢?您需要识别每个方法(我想使用VTID),但是如何检索这个数字呢?我使用了为我生成接口的com4j库:@DISPID(1610809392)//=0x60030030。如果存在@VTID(16)int saveResult(@marshallas(NativeType.VARIANT)java.lang.Object strXMLResultText),则运行时将首选VTID;我将在我的第一个问题中发布一个答案。谢谢你的回答!我查了一下注册表。请查看我问题的“编辑”部分。谢谢!!!你让我走上了正确的道路来解决这个问题。我必须注册.dll。这有助于Liam从你的链接中得到回应:很高兴听到这个。出于好奇,那么您如何能够从com4j调用这两个方法呢?您需要识别每个方法(我想使用VTID),但是如何检索这个数字呢?我使用了为我生成接口的com4j库:@DISPID(1610809392)//=0x60030030。如果存在@VTID(16)int saveResult(@marshallas(NativeType.VARIANT)java.lang.Object strXMLResultText),则运行时将首选VTID;我将在第一个问题中给出答案。
Exception in thread "main" com4j.ExecutionException: com4j.ComException: 80040154 CoCreateInstance failed : Class not registered : .\com4j.cpp:153
    at com4j.ComThread.execute(ComThread.java:203)
    at com4j.Task.execute(Task.java:25)
    at com4j.COM4J.createInstance(COM4J.java:97)
    at com4j.COM4J.createInstance(COM4J.java:72)
    at DLL.ClassFactory.createTester(ClassFactory.java:21)
    at proiect.DllTest.run(DllTest.java:17)
    at proiect.DllTest.main(DllTest.java:11)
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) Client VM (build 25.171-b11, mixed mode)
 public static DLL._Tester createTester() {
    return COM4J.createInstance( DLL._Tester.class, "{4B7CF2DB-F936-4BA3-9DC6-5E99E5220270}" );
  }