Не удалось выполнить класс COM: com4j.ComException: 80040154 Ошибка CoCreateInstance: класс не зарегистрирован: .\ Com4j.cpp:153
Я пытаюсь в течение нескольких дней выполнить файл.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 -версию" в командной строке:
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}" );
}
1 ответ
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 в разделе "Классы"?
Привет, я столкнулся с той же проблемой один месяц назад, и окончательное решение, которое я нашел, которое решило мою проблему, изменило мой Java 64-битный на 32-битный, и он начал работать. примечание - только добавьте com4j.jar в путь сборки и не регистрируйте файлы.dll.
Надеюсь, это будет работать для вас