Получение 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();
}
1 ответ
В нашем приложении мы в настоящее время используем Com4J для доступа к элементам управления COM, но мы заметили, что некоторые элементы управления ActiveX плохо реализовали функции диспетчеризации (если я правильно понял), поэтому мы должны выбрать для каждого элемента управления, если мы используем:
- Com4J для прямого доступа к нему
- Оболочка VB6 для элемента управления COM, в которой имеется ссылка на элемент управления COM, но мы должны предоставить оболочки для методов, которые мы вызываем, и вызывать их из Com4J.
или для встраивания OLE
- SWT COM Brigde.
Я работал с Джейкобом раньше, но это казалось очень нестабильным (по крайней мере, для элементов управления ActiveX, которые я пробовал некоторое время назад).