2010-07-12 6 views
2

Com4J를 사용하여 Microsoft Outlook과 상호 작용하고 있습니다. Com4J tutorial에 따라 Java 유형 정의를 생성했습니다. 다음은 사용자가 이메일을 닫을 때까지 기다리는 코드의 예입니다.Com4J를 통해 COM 이벤트를받지 못하는 이유는 무엇입니까?

// 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"을 인쇄하지 않습니다.

답변

3

Com4J가 내 시나리오에서 이벤트 클래스 (ItemEvents)를 생성 할 때 생성 된 모든 메서드의 기본 동작은 UnsupportedOperationException (자세한 내용은 com4j.tlbimp.EventInterfaceGenerator 클래스 참조)입니다.

예를 들어

, 여기 내 익명 클래스의 오버라이드 (override)는 ItemEvents 클래스의 close 방법 : 내 익명 클래스 super.close(cancel); 호출 할 때

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

따라서, 상위 클래스에 도달 실행을 방지 UnsupportedOperationException을 던졌습니다 내 System.out.println("Closed"); 성명. 따라서, 내 익명의 클래스는 정말는 다음과 같이 봤어야 : 나를 놀라게 무엇

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

는 나에게 전혀 표시를 남기지 않고, Com4J 단순히 가 모두 이벤트 핸들러에서 던져 UnsupportedOperationException을 무시하도록 나타납니다 있다는 것입니다 실제로 무엇을 일어난.

Getting ready to throw the exception...

하지만, RuntimeException 이제까지 던져졌다 아무 표시가없는 :

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

프로그램이 출력을 방출 : 나는 보여주기 위해이 코드를 썼다.

관련 문제