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

时间:2018-05-19 07:45:38

标签: java dll comm com4j

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

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

@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

2 个答案:

答案 0 :(得分:1)

CoCreateInstance failed : Class not registered表示您提供的GUID与Windows注册表中的任何COM项都不匹配。

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

要注册您的DLL,可能会How do I register a DLL file on Windows 7 64-bit?帮助。

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

答案 1 :(得分:0)

嗨,我一个月前也遇到了同样的问题,而我制定的解决我的问题的最终解决方案是将我的Java 64位更改为32位,并且开始工作。 注意-仅在构建路径中添加com4j.jar,不要注册任何.dll文件。

希望这对您有用