【问题标题】:Why am I not receiving COM events via Com4J?为什么我没有通过 Com4J 接收 COM 事件?
【发布时间】:2011-03-14 18:24:20
【问题描述】:

我正在使用 Com4J 与 Microsoft Outlook 进行交互。我已经根据Com4J tutorial 生成了 Java 类型定义。下面是一些等待用户关闭电子邮件的代码示例。

// 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"

【问题讨论】:

    标签: java events com com4j


    【解决方案1】:

    当 Com4J 生成一个事件类(在我的场景中为ItemEvents)时,所有生成的方法的默认行为是抛出一个UnsupportedOperationException(有关详细信息,请参阅com4j.tlbimp.EventInterfaceGenerator 类)。

    例如,这里是我的匿名类重写的ItemEvents 类的close 方法:

    @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!");
                }
            }
        );
    

    程序发出这个输出:

    准备抛出异常...

    但是,没有迹象表明曾经抛出过 RuntimeException

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多