Получение 32-битного COM-клиента для взаимодействия с 64-битным сервером вне процесса с использованием Java / JaCoB - PullRequest
3 голосов
/ 10 января 2011

Этот вопрос указывает на то, что 32-разрядный COM-клиент может общаться с 64-разрядным COM-сервером (и наоборот), если сервер находится вне процесса.Я пытаюсь реализовать клиент, использующий библиотеку Java Com Bridge (JaCoB), для взаимодействия со сторонним сервером вне процесса таким способом, который должен быть возможен в соответствии с этим вопросом .Тестовый код, который я использую, будет успешным, если я сопоставлю архитектуру процесса (от 32-битной до 32-битной или от 64-битной до 64-битной), но не получится для любой кросс-комбинации, за исключением этого:* Есть идеи?


Обновление

После отладки исключения я вполне уверен, что основная ошибка COM - DISP_E_BADCALLEE .После некоторых поисков в Интернете я обнаружил, что возможная причина - недопустимая сигнатура метода, так что вот еще некоторые подробности.COM-сервер - MATLAB, и я пытаюсь вызвать методы Execute и Quit.Вот их сигнатуры COM-типа (из OLEView):

BSTR _stdcall Execute ([in] BSTR Name);
void _stdcall Quit ();

Andвот мой тестовый код:

public static void main(String[] args) {
    ActiveXComponent ml = new ActiveXComponent("Matlab.Application.Single.7");
    System.out.println(ml.invoke("Execute","version"));
    ml.invoke("Quit");
    ml.safeRelease();
}

1 Ответ

1 голос
/ 18 января 2011

В нашем приложении в настоящее время мы используем Com4J для доступа к элементам управления COM, но мы заметили, что некоторые элементы управления ActiveX имеют плохо реализованные функции диспетчеризации (если я правильно понял), поэтому мы должны выбрать для каждого элемента управления, если мы используем:

  • Com4J для прямого доступа к нему
  • Оболочка VB6 для элемента управления COM, в которой имеется ссылка на элемент управления COM, но мы должны предоставить оболочки для методов, которые мы вызываем, и вызывать их из Com4J

или, для встраивания OLE

  • SWT COM Brigde.

Я работал с Джейкобом раньше, но он казался очень нестабильным (по крайней мере, для элементов управления ActiveX, которые я пробовал некоторое время назад).

...