Я создаю вспомогательный объект браузера, используя 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(DIID_HTMLElementEvents2). (См. статью msdn об обработке HTMLElementEvents2). Проблема в том, что когда я перезаписываю IDispatch::Invoke в своем классе, дескрипторы DWebBrowserEvents2 (созданные с использованием макросов ATL) терпят неудачу. Есть ли способ обработки HTMLElementEvents2 без перезаписи Invoke или реализации вызова таким образом, чтобы он обрабатывал только HTMLElementEvents2?
Спасибо, любая помощь будет оценена по достоинству.