Pregunta

Estoy creando un Browser Helper Object usando VS2008, C ++. Mi clase se ha derivado de IDispEventImpl entre muchos otros

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()
.
.
.
}

Como es evidente en el código anterior, mis DWebBrowserEvents2 se manejan mediante macros de la ATL. Ahora quiero manejar HTMLElementEvents2 (para detectar clics, barras de desplazamiento, etc.) Para eso, QueryInterface () del objeto IHTMLDocument2 para IHTMLElement, QueryInterface () para que IConnectionPointContainer y llamar IConnectionPointContainer :: FindConnectionPoint (DIID_HTMLElementEvents2). (Ver artículo de MSDN en el manejo de HTMLElementEvents2). El problema es, cuando sobreescribo IDispatch :: Invoke en mi clase, los mangos DWebBrowserEvents2 (creados mediante macros ATL) fallan. ¿Hay una manera de manejar HTMLElementEvents2 sin sobrescribir invocación, o implementar invocar de manera tal que sólo se ocupa de HTMLElementEvents2?
Gracias, se apreciará Cualquier ayuda.

¿Fue útil?

Solución

No hay necesidad real para anular invocación o conseguir IConnectionPointContainer. Dado que este es un proyecto ATL, la implementación de otra IDispEventImpl:

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

hace el truco. A continuación, el fregadero de la entrada como:

SINK_ENTRY_EX(2, DIID_HTMLTextContainerEvents2, DISPID_ONSCROLL, OnScroll)

En OnDocumentComplete, llame IWebBrowser2 :: get_Document, IHTMLDocument2 :: get_body, y luego llamar a DispEventAdvise para comenzar a recibir eventos.

Tenga en cuenta que he utilizado en lugar de DIID_HTMLTextContainerEvents2 DIID_HTMLElementEvents. Eso es porque el cuerpo objeto no soporta HTMLElementEvents2, y para mi propósito (para manejar el desplazamiento) esto funciona muy bien!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top