Почему я не получаю события COM через Com4J? - PullRequest
2 голосов
/ 12 июля 2010

Я использую Com4J для взаимодействия с Microsoft Outlook.Я сгенерировал определения типов Java согласно Com4J учебник .Вот пример кода, который ждет, когда пользователь закроет письмо.

// Registers my event handler
mailItem.advise(
        ItemEvents.class,
        new ItemEvents() {
            @Override
            public void close(Holder<Boolean> cancel) {
                // TODO Auto-generated method stub
                super.close(cancel);
                System.out.println("Closed");
            }
        }
    );

// Displays the email to the user
mailItem.display();

Этот код успешно отображает письмо для пользователя.К сожалению, моя программа никогда не печатает "Closed", когда пользователь закрывает окно.

1 Ответ

4 голосов
/ 12 июля 2010

Когда Com4J генерирует класс событий (ItemEvents в моем сценарии), поведение по умолчанию для всех сгенерированных методов - выбросить UnsupportedOperationException (подробнее см. Класс com4j.tlbimp.EventInterfaceGenerator).

Например, вот метод close класса ItemEvents, который переопределяет мой анонимный класс:

@DISPID(61444)
public void close(Holder<Boolean> cancel) {
    throw new UnsupportedOperationException();
}

Поэтому, когда мой анонимный класс вызывает super.close(cancel);, родительский класс выдает UnsupportedOperationException, не позволяя выполнению достичь моего оператора System.out.println("Closed");. Поэтому мой анонимный класс должен действительно выглядеть так:

mailItem.advise(
        ItemEvents.class,
        new ItemEvents() {
            @Override
            public void close(Holder<Boolean> cancel) {
                System.out.println("Closed");
            }
        }
    );

Что удивило меня, так это то, что Com4J, похоже, просто проигнорировал UnsupportedOperationException, полностью выброшенный из обработчика событий, не оставив мне никаких признаков того, что на самом деле произошло. Я написал этот код для демонстрации:

mailItem.advise(
        ItemEvents.class,
        new ItemEvents() {
            @Override
            public void close(Holder<Boolean> cancel) {
                System.out.println("Getting ready to throw the exception...");
                throw new RuntimeException("ERROR! ERROR!");
            }
        }
    );

Программа выдает следующие выходные данные:

Getting ready to throw the exception...

Однако нет никаких признаков того, что RuntimeException когда-либо был брошен.

...