Подключите 64-битную Java к 32-битной COM dll с помощью Com4j или Jacob

У меня такая конфигурация:

1) Windows 10 64-битная

2) Приложение, имеющее только 32-битную версию и доступное через COM.

Я обращаюсь к файлу .dll 32-разрядного приложения с помощью tlbimb.jar для создания необходимых интерфейсов, и мне это удается.

Сценарий 1. Я пытаюсь получить доступ к 32-разрядному приложению с помощью установки Java 8 32-разрядной. Я могу вызвать методы через COM успешно без каких-либо проблем.

Сценарий 2: я пытаюсь получить доступ к 32-разрядному приложению, используя 64-разрядную установку Java 8. Я получаю сообщение об ошибке:

Exception in thread "main" com4j.ExecutionException: com4j.ComException: 80040154 CoCreateInstance failed : Class not registered : .\com4j.cpp:153

Я искал исключение в Stackoverflow / Google и сделал следующее:

1) Зарегистрировал dll приложения, используя как Sys64WOW / regsvr32.exe, так и System32 / regsvr32.exe

2) Зарегистрировал dll com4j (32- и 64-разрядный), используя как Sys64WOW / regsvr32.exe, так и System32 / regsvr32.exe

3) Скопировал dll в папки Sys64WOW и System32.

Все вышесказанное я проделал отдельно, проверив все возможные комбинации. Упомянутая ошибка при использовании 64-битной Java все еще существует.

Я пробовал использовать другой мост (Джейкоб). На 32-битной Java это удается, на 64-битной Java - нет.

У меня есть вопрос к тому, кто может знать: есть ли способ подключить приложение, которое, насколько я могу судить, предлагает только Win32 COM dll [1], используя любую из доступных Java / COM-мосты и 64-битная Java? Или просто 32-битный COM + 64-битный Java не подключаются?

[1]: Я проверил OLE / COM Viewer и в библиотеке типов есть только одна запись "0 Win32 =", поэтому я имел в виду, что это означает, что нет Win64 COM dll, верно?


person Thanos    schedule 31.03.2017    source источник


Ответы (1)


Это не сработает, потому что разрядность вашего клиентского процесса и COM DLL не совпадает. При попытке создать новый экземпляр CoCreateInstance пытается найти информацию о связанных классах в 64-битном кусте реестра. Это не удается, потому что он фактически находится в 32-разрядном улье, в котором вы зарегистрировали DLL.

Чтобы исправить это, у вас есть возможность использовать суррогатный процесс, который позволяет создать экземпляр вашего CoClass в отдельном собственном процессе. Затем ваш клиент может общаться с суррогатом через IPC (см. здесь для получения дополнительной информации).

В качестве быстрого старта вы можете пометить свой CoClass как кандидата на dllhost.exe суррогатный процесс по умолчанию: OLE / COM Object Viewer (x86) как Admin> Все объекты> [Ваш CoClass]> Реализация> Использовать суррогатный процесс (оставьте путь пустым).

Если вы собираетесь распространять свое приложение, вы можете поместить эту информацию в сценарий REG или импортировать свою DLL в серверное приложение COM +.

person Aurora    schedule 31.03.2017
comment
Спасибо за ответ. Я сделал это В качестве быстрого старта вы можете пометить свой CoClass как кандидата на суррогатный процесс dllhost.exe по умолчанию: OLE / COM Object Viewer (x86) ›Все объекты› [Your CoClass] ›Реализация› Использовать суррогатный процесс (оставьте путь пустой). но все та же ошибка. Я отмечаю поле «Использовать суррогатный процесс», но когда я перехожу к другому классу CoClass, а затем возвращаюсь к своему классу CoClass, флажок не устанавливается. Есть ли шанс, что мой выбор не спасет? - person Thanos; 01.04.2017
comment
Вы запускали oleview как администратор? Для записи в реестр требуются соответствующие привилегии. Вы можете убедиться, что настройки были сохранены правильно, переключившись на вкладку «Реестр» вашего CoClass. Под узлом AppID должна быть видна запись [DllSurrogate]. - person Aurora; 01.04.2017
comment
Хорошо, мне пришлось работать как администратор. Сейчас он сохранен и работает с 64-битной Java. Большое Вам спасибо. Ваша помощь очень ценится. - person Thanos; 01.04.2017
comment
Можете ли вы добавить образец сценария или объяснить, как его создать? - person orirab; 09.03.2021
comment
Взгляните на этот ответ в качестве примера. - person Aurora; 15.03.2021