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

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

Exception in thread "main" com.jacob.com.ComFailException: A COM exception has been encountered:
At Invoke of: Execute
Description: Invalid callee.

    at com.jacob.com.Dispatch.invokev(Native Method)
    at com.jacob.com.Dispatch.invokev(Dispatch.java:858)
    at com.jacob.com.Dispatch.callN(Dispatch.java:455)
    at com.jacob.com.Dispatch.call(Dispatch.java:544)
    at com.jacob.activeX.ActiveXComponent.invoke(ActiveXComponent.java:447)
    ...

Любые идеи?


Обновить

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

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

А вот и мой тестовый код:

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();
}

person Kevin K    schedule 10.01.2011    source источник


Ответы (1)


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

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

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

  • SWT COM Brigde.

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

person Daniel    schedule 17.01.2011