代码之家  ›  专栏  ›  技术社区  ›  Adam Paynter

为什么我没有通过Com4J接收COM事件?

  •  2
  • Adam Paynter  · 技术社区  · 14 年前

    Com4J tutorial

    // 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 回复  |  直到 14 年前
        1
  •  4
  •   Adam Paynter    14 年前

    ItemEvents 在我的场景中),所有生成的方法的默认行为都是抛出 UnsupportedOperationException (参见 com4j.tlbimp.EventInterfaceGenerator 类以获取详细信息)。

    close 方法 项目事件 我的匿名类覆盖的类:

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

    因此,当我的匿名类调用 super.close(cancel); ,父类抛出 不支持操作异常 ,阻止执行到达我的 System.out.println("Closed"); 真正地 就像这样:

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

    令我惊讶的是Com4J似乎 这个 不支持操作异常 完全从事件处理程序抛出,没有留下任何实际发生的迹象。我写这段代码是为了演示:

    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 曾经被扔过。