2015-01-08 12 views

답변

2

서로 다른 인터페이스를 사용합니다. 서로 다른 인터페이스를 사용하는 경우도 있습니다.

HTMLDocument COM 개체는 여러 인터페이스를 사용하여 이벤트를 전달할 수 있으며 COM 클라이언트는 사용할 인터페이스를 선택합니다. 원래는 HTMLDocumentEvents이었고 원래 인터페이스를 그대로두고 새 메서드 인터페이스 (HTMLDocumentEvents2, HTMLDocumentEvents3, HTMLDocumentEvents4)를 추가 할 것을 제안하는 새 이벤트를 추가하는 개체를 확장해야했습니다.

확장 인터페이스는 이전 이벤트 인터페이스를 사용하는 기존 클라이언트와의 호환성을 손상시키지 않으면 서 추가적인 방법, 인수를 가질 수 있습니다.

dispinterface HTMLDocumentEvents { 
    properties: 
    methods: 
     [id(0x8001000a)] 
     VARIANT_BOOL onhelp(); 
     [id(0xfffffda8)] 
     VARIANT_BOOL onclick(); 

dispinterface HTMLDocumentEvents2 { 
    properties: 
    methods: 
     [id(0x8001000a)] 
     VARIANT_BOOL onhelp([in] IHTMLEventObj* pEvtObj); 
     [id(0xfffffda8)] 
     VARIANT_BOOL onclick([in] IHTMLEventObj* pEvtObj); 
+0

두 개의 인터페이스에 대한 방법은 onhelp, onclick인데 왜 대답입니까? 표시된 메소드는 WebBrowser 컴포넌트의'DWebBrowserEvents' 및'DWebBrowserEvents2' 디스패치에 관한 것이고, op는 MSHTML 컴포넌트의'HTMLDocumentEvents' 및'HTMLDocumentEvents2' 디스패치에 대해 묻고 있습니다. – acelent

+0

@PauloMadeira : 정확합니다. 틀린 발췌입니다. –

+0

그래도 여전히 주된 이유는'HTMLDocumentEvents'를 사용하면 문서에서 이벤트 객체를 가져와야합니다 (예 : document-> parentWindow (window); window-> event (& event);). 이벤트 처리기는 문서에 대한 포인터를 미리 가져야했습니다. 'HTMLDocumentEvents2'를 사용하면 모든 메소드에 이벤트 객체를 간단하게 제공 할 수 있습니다. 대부분의 경우 문서에 대한 참조를 유지하지 않고도 충분합니다. 따라서 이벤트 핸들러가 순환 참조에서 문서를 유지하지 못하게합니다. – acelent