DWEBBROWSEREVENTS2가 ATL의 매크로를 사용하여 처리 된 경우 htmlelementevents2 처리

StackOverflow https://stackoverflow.com/questions/1106659

문제

VS2008, C ++를 사용하여 브라우저 헬퍼 객체를 만들고 있습니다. 내 수업은 다른 많은 것들 중에서 idispeventimpl에서 파생되었습니다.

class ATL_NO_VTABLE CHelloWorldBHO :
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CHelloWorldBHO, &CLSID_HelloWorldBHO>,
    public IObjectWithSiteImpl<CHelloWorldBHO>,
    public IDispatchImpl<IHelloWorldBHO, &IID_IHelloWorldBHO, &LIBID_HelloWorldLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
    public IDispEventImpl<1, CHelloWorldBHO, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 1>

{
.
.
.
BEGIN_SINK_MAP(CHelloWorldBHO)
     SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete)
     SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_BEFORENAVIGATE2, BeforeNavigate2)//Handle BeforeNavigate2
END_SINK_MAP()
.
.
.
}

위의 코드에서 알 수 있듯이 Dwebbrowserevents2는 ATL의 매크로를 사용하여 처리됩니다. 이제 htmlelementevents2 (클릭, 스크롤 바 등을 감지하기 위해)를 처리하려고합니다. ihtmllement의 ihtmldocument2 객체, ihtmlelement, QueryInterface ()의 QueryInterface () IConnectionPointContainer :: findConnectionPoint (diid_htmlelementev22). (보다 MSDN의 기사 htmlelementevents 2를 처리 할 때 2). 문제는 Idispatch :: 내 수업에서 호출 할 때 Dwebbrowserevents2 핸들 (ATL 매크로를 사용하여 생성)이 실패한다는 것입니다. htmlelementevents2 만 처리하지 않고 Htmlelementevents2를 처리하거나 호출을 구현할 수있는 방법이 있습니까?
감사합니다. 도움이 주셔서 감사합니다.

도움이 되었습니까?

해결책

ICOnnectionPointContainer 호출을 재정의 할 필요가 없습니다. 이것은 ATL 프로젝트이므로 다른 idispeventimpl을 구현합니다.

public IDispEventImpl<2, CHelloWorldBHO, &DIID_HTMLTextContainerEvents2, &LIBID_MSHTML, 4, 0>

트릭을 수행합니다. 그런 다음 항목을 다음과 같이 싱크합니다.

SINK_ENTRY_EX(2, DIID_HTMLTextContainerEvents2, DISPID_ONSCROLL, OnScroll)

ondocumentComplete에서 iwebbrowser2 :: get_document, ihtmldocument2 :: get_body로 전화 한 다음 dispeventAdVise를 호출하여 이벤트 수신을 시작하십시오.

diid_htmlelementevents 대신 diid_htmltextContainerevents2를 사용했습니다. 바디 객체가 HtmlElementevents2를 지원하지 않기 때문에 (스크롤을 처리하기 위해) 이것은 잘 작동하기 때문입니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top