Pregunta

Básicamente quiero desarrollar un BHO que valide ciertos campos en un formulario y coloque automáticamente correos electrónicos desechables en los campos apropiados (más para mi propio conocimiento). Entonces, en el evento DOCUMENTCOMPLETE, tengo esto:

for(long i = 0; i < *len; i++)
{
    VARIANT* name = new VARIANT();
    name->vt = VT_I4;
    name->intVal = i;
    VARIANT* id = new VARIANT();
    id->vt = VT_I4;
    id->intVal = 0;
    IDispatch* disp = 0;
    IHTMLFormElement* form = 0;
    HRESULT r = forms->item(*name,*id,&disp);
    if(S_OK != r)
    {
        MessageBox(0,L"Failed to get form dispatch",L"",0);// debug only
        continue;
    }
    disp->QueryInterface(IID_IHTMLFormElement2,(void**)&form);
    if(form == 0)
    {
        MessageBox(0,L"Failed to get form element from dispatch",L"",0);// debug only
        continue;
    }

    // Code to listen for onsubmit events here...         
}

¿Cómo usaría la interfaz IHTMLFormElement para escuchar el evento onsubmit?

¿Fue útil?

Solución

Una vez que tenga el puntero al elemento para el que desea hundir los eventos, debe QueryInterface () para IConnectionPointContainer y luego conectarse a eso:

REFIID riid = DIID_HTMLFormElementEvents2;
CComPtr<IConnectionPointContainer> spcpc;
HRESULT hr = form->QueryInterface(IID_IConnectionPointContainer, (void**)&spcpc);
if (SUCCEEDED(hr))
{
    CComPtr<IConnectionPoint> spcp;
    hr = spcpc->FindConnectionPoint(riid, &spcp);
    if (SUCCEEDED(hr))
    {
        DWORD dwCookie;
        hr = pcp->Advise((IDispatch *)this, &dwCookie);
    }
}

Algunas notas:

  1. Probablemente desee almacenar en caché dwCookie y cpc , ya que los necesitará más tarde cuando llame a pcp- > Unadvise () para desconectarse el fregadero.
  2. En la llamada a pcp- > Advise () anterior, paso esto. Puede usar cualquier objeto que tenga que implemente IDispatch , que puede ser o no este objeto. Diseño que te queda.
  3. riid será el evento dispinterface que desea hundir. En este caso, probablemente desee DIID_HTMLFormElementEvents2 .

Aquí se explica cómo desconectarse:

pcp->Unadvise(dwCookie);

Avíseme si tiene más preguntas.

Editar-1:

Sí, ese DIID estaba equivocado. Debería ser: DIID_HTMLFormElementEvents2 .

Así es como lo encontré:

C:\Program Files (x86)\Microsoft Visual Studio 8\VC\PlatformSDK>findstr /spin /c:"Events2" *.h | findstr /i /c:"form"
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top