Domanda

Fondamentalmente voglio sviluppare un BHO che convalida determinati campi in un modulo e posiziona automaticamente le e-mail usa e getta nei campi appropriati (più per mia conoscenza). Quindi nell'evento DOCUMENTCOMPLETE ho questo:

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

Come utilizzare l'interfaccia IHTMLFormElement per ascoltare l'evento onsubmit?

È stato utile?

Soluzione

Una volta che hai il puntatore sull'elemento per cui vuoi affondare gli eventi, lo QueryInterface () per IConnectionPointContainer e quindi ti connetti a questo:

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);
    }
}

Alcune note:

  1. Probabilmente vuoi mettere in cache dwCookie e cpc , dato che ti servono in seguito quando chiami pcp- > Unadvise () per disconnetterti il lavandino.
  2. Nella chiamata a pcp- > Advise () sopra, passo questo. Puoi usare qualsiasi oggetto tu abbia implementato IDispatch , che può essere o meno questo oggetto. Design lasciato a te.
  3. riid sarà l'interfaccia di evento che vuoi affondare. In questo caso, probabilmente vuoi DIID_HTMLFormElementEvents2 .

Ecco come disconnettersi:

pcp->Unadvise(dwCookie);

Fammi sapere se hai ulteriori domande.

Modifica-1:

Sì, quel DIID era sbagliato. Dovrebbe essere: DIID_HTMLFormElementEvents2 .

Ecco come l'ho trovato:

C:\Program Files (x86)\Microsoft Visual Studio 8\VC\PlatformSDK>findstr /spin /c:"Events2" *.h | findstr /i /c:"form"
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top