Обрабатывать HTMLElementEvents2, когда DWebBrowserEvents2 обрабатывается с использованием макросов ATL - PullRequest
1 голос
/ 10 июля 2009

Я создаю объект Browser Helper, используя 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 (для обнаружения щелчков, полос прокрутки и т. Д.). Для этого я QueryInterface () объекта IHTMLDocument2 для IHTMLElement, QueryInterface (), который для IConnectionPointContainer, и вызова IConnectionPointContainer :: FindConnectionPoint (DIIDleEHT) (См. статью MSDN по обработке HTMLElementEvents2). Проблема в том, что когда я перезаписываю IDispatch :: Invoke в моем классе, описатели DWebBrowserEvents2 (созданные с помощью макросов ATL) завершаются ошибкой. Есть ли способ обработать HTMLElementEvents2 без перезаписи Invoke или реализовать invoke таким образом, чтобы он обрабатывал только HTMLElementEvents2?
Спасибо, любая помощь будет оценена.

1 Ответ

1 голос
/ 18 июля 2009

Нет реальной необходимости переопределять Invoke или получать 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_HTMLTextContainerEvents2 вместо DIID_HTMLElementEvents. Это потому, что объект body не поддерживает HTMLElementEvents2, и для моей цели (для обработки прокрутки) это работает просто отлично!

...