Я пишу программу на Java, которая взаимодействует с Microsoft Outlook, используя библиотеку Jacob (соединяет COM и Java).Эта программа создает новое MailItem , , отображающее его Инспектор для пользователя.Я хочу подписаться на Закрыть событие инспектора , чтобы знать, когда пользователь закончит редактирование своего почтового элемента.
Чтобы подписаться на событие, я следовал инструкциям Документация Джейкоба (около 2 ⁄ 3 вниз по странице):
Текущая модель [события] концептуально похожа на конструкцию Visual Basic WithEvents
,По сути, я предоставляю класс с именем com.jacob.com.DispatchEvents
, который имеет конструктор, который принимает исходный объект (типа com.jacob.com.Dispatch
) и целевой объект (любого типа).Исходный объект запрашивается для его интерфейса IConnectionPointContainer
, и я пытаюсь получить IConnectionPoint
для его исходного интерфейса по умолчанию (который я получаю из IProvideClassInfo
).В то же время я также создаю отображение DISPID для исходного интерфейса по умолчанию на фактические имена методов.Затем я использую имена методов, чтобы получить jmethodID
дескрипторы от целевого объекта Java. В настоящее время все методы событий должны иметь одну и ту же сигнатуру: один аргумент, представляющий собой массив вариантов Java, и возвращаемый тип void.
Вот мой класс InspectorEventHandler
, соответствующийк документации Джейкоба:
public class InspectorEventHandler {
public void Activate(Variant[] arguments) {
}
public void BeforeMaximize(Variant[] arguments) {
}
public void BeforeMinimize(Variant[] arguments) {
}
public void BeforeMove(Variant[] arguments) {
}
public void BeforeSize(Variant[] arguments) {
}
public void Close(Variant[] arguments) {
System.out.println("Closing");
}
public void Deactivate(Variant[] arguments) {
}
public void PageChange(Variant[] arguments) {
}
}
И вот как я подписываюсь на события, используя этот InspectorEventHandler
класс:
Object outlook = new ActiveXComponent("Outlook.Application");
Object mailItem = Dispatch.call(outlook, "CreateItem", 0).getDispatch();
Object inspector = Dispatch.get(mailItem, "GetInspector").getDispatch();
InspectorEventHandler eventHandler = new InspectorEventHandler();
// This supposedly registers eventHandler with the inspector
new DispatchEvents((Dispatch) inspector, eventHandler);
Однако последняя строка завершается с ошибкой со следующим исключением:
Exception in thread "main" com.jacob.com.ComFailException: Can't find event iid
at com.jacob.com.DispatchEvents.init(Native Method)
at com.jacob.com.DispatchEvents.(DispatchEvents.java)
at cake.CakeApplication.run(CakeApplication.java:30)
at cake.CakeApplication.main(CakeApplication.java:15)
couldn't get IProvideClassInfo
Согласно Google , некоторые другие также получили эту ошибку.К сожалению, никто из них не получил ответа.
Я использую версию 1.7 библиотеки Jacob, которая утверждает, что предотвращает эту проблему:
Версия 1.7 также включает код для чтениябиблиотека типов прямо из проги.Это позволяет работать со всеми событиями приложения Microsoft Office, а также с событиями IE5.Для примера см. Пример samples / test / IETest.java.
Я заметил, что вышеупомянутый файл IETest.java
подписывается на такие события:
new DispatchEvents((Dispatch) ieo, ieE,"InternetExplorer.Application.1");
Поэтому япопытался подписаться на мои события аналогичным образом:
new DispatchEvents((Dispatch) inspector, eventHandler, "Outlook.Application");
new DispatchEvents((Dispatch) inspector, eventHandler, "Outlook.Application.1");
new DispatchEvents((Dispatch) inspector, eventHandler, "Outlook.Application.12");
Все эти попытки не увенчались успехом с той же ошибкой.