java - 无法执行 COM 类 : com4j. ComException : 80040154 CoCreateInstance failed : Class not registered : .\com4j.cpp:153

标签 java dll comm com4j

我花了几天时间尝试从 JAVA 应用程序执行“.dll”文件。如果您有兴趣可以阅读我的第一个问题:Call a .dll function using command line

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

@DISPID(1610809376) //= 0x60030020. The runtime will prefer the VTID if present
  @VTID(8)
  int getUnitInfo(
    java.lang.String strRequest,
    Holder<java.lang.String> strUnitInfo,
    @Optional @DefaultValue("") java.lang.String strStationName,
    @Optional @DefaultValue("") java.lang.String strUserID);

实例:

Holder<String> holder = new Holder<String>("test");
        _Tester instance =  ClassFactory.createTester();
        instance.getUnitInfo("", holder, "", "");  

但是它抛出了这个异常:

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)

我在互联网上阅读了很多有关此问题的帖子,但没有任何帮助。 使用“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 注册表中找到了这个: enter image description here

最佳答案

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

您可以尝试使用不同的 GUID 加载 COM 对象 - 进入系统注册表并找到任何有效的 GUID,可能是与 Microsoft Excel 关联的 GUID(在我的例子中,该条目位于 Computer\HKEY_CLASSES_ROOT\Excel .Application\CLSID)。

要注册您的 DLL,也许 How do I register a DLL file on Windows 7 64-bit?有帮助。

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

关于java - 无法执行 COM 类 : com4j. ComException : 80040154 CoCreateInstance failed : Class not registered : .\com4j.cpp:153,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50423026/

相关文章:

java - 我在 Swift 和 Java 中的代码。 Swift 给出错误,但 Java 没有。有什么不同吗?

Java 8 - 如何使用 CompletableFuture 跟踪异步并行流中调用的异常数量

c++ - Qt 槽不在多线程 DLL 中执行

c# - 如何防止类看到 DLL 文件

linux - 比较二进制文件并仅打印匹配行的偏移量

java - Javascript <-> Java AES

java - StringBuffer 不附加数据 - 由于线程?

python - 使用 ctypes 从 DLL 导入#defines、常量和 typedef

linux - comm 在具有相同元素的两个日志文件之间不匹配

linux - linux "comm"工具比较文件时如何显示行号