Не удалось выполнить класс COM: com4j.ComException: 80040154 Ошибка CoCreateInstance: класс не зарегистрирован:. \ Com4j.cpp: 153 - PullRequest
0 голосов
/ 19 мая 2018

Я пытаюсь в течение нескольких дней выполнить файл .dll из приложения JAVA.Если вам интересно, вы можете прочитать мой первый вопрос: Вызов функции .dll с помощью командной строки

Я использовал «com4j» для создания классов COM для моей DLL.Сгенерированные классы выглядят хорошо, и я попытался выполнить код, точнее, метод с именем "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 deconstruct", я обнаружил, что файл .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 голосов
/ 01 марта 2019

Привет, я столкнулся с той же проблемой один месяц назад, и окончательное решение, которое я нашел, которое решило мою проблему, изменило мой Java 64-битный на 32-битный, и он начал работать.примечание - только добавьте com4j.jar в путь сборки и не регистрируйте файлы .dll.

Надеюсь, это будет работать для вас

0 голосов
/ 19 мая 2018

CoCreateInstance failed : Class not registered означает, что предоставленный вами GUID не соответствует ни одному элементу COM в вашем реестре Windows.

Вы можете попробовать загрузить объект COM с другим GUID - перейти в системный реестр и найти любой действительный GUID,может быть тот, который связан с Microsoft Excel (в моем случае, запись находится в Computer\HKEY_CLASSES_ROOT\Excel.Application\CLSID).

Чтобы зарегистрировать вашу DLL, возможно Как мне зарегистрировать файл DLL в Windows 7 64-bit? помогает.

РЕДАКТИРОВАТЬ Проверьте свой реестр в Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID.Вы указали GUID в разделе Классы?

...