Frage

Grundsätzlich möchte ich ein BHO entwickeln, die bestimmte Felder auf einem Formular und Auto-Orte Wegwerf-E-Mails in den entsprechenden Feldern (mehr für mein eigenes Wissen) validiert. So im Fall DocumentComplete' Ich habe diese:

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

Wie würde ich verwenden, um die IHTMLFormElement Schnittstelle für das onsubmit Ereignis zu hören?

War es hilfreich?

Lösung

Wenn Sie den Zeiger auf das Element haben Sie versenken Ereignisse wollen, würden Sie es für QueryInterface() IConnectionPointContainer und dann eine Verbindung zu, dass:

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

Einige Hinweise:

  1. Sie wollen wahrscheinlich dwCookie und cpc zwischenzuspeichern, da Sie sie später benötigen, wenn Sie pcp->Unadvise() rufen Sie das Waschbecken trennen.
  2. In der Anruf oben pcp->Advise(), gebe ich diese. Sie können jedes Objekt nutzen, müssen die IDispatch implementiert, die oder nicht diese Aufgabe sein kann. Design links zu dir.
  3. riid wird das Ereignis dispinterface Sie versenken wollen. In diesem Fall möchten Sie wahrscheinlich DIID_HTMLFormElementEvents2.

Hier ist, wie zu trennen:

pcp->Unadvise(dwCookie);

Lassen Sie mich wissen, wenn Sie weitere Fragen haben.

Edit-1:

Ja, das DIID war falsch. Es sollte sein:. DIID_HTMLFormElementEvents2

Hier ist, wie ich fand es:

C:\Program Files (x86)\Microsoft Visual Studio 8\VC\PlatformSDK>findstr /spin /c:"Events2" *.h | findstr /i /c:"form"
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top