2009-09-13 6 views
2

Fondamentalement, je veux développer un BHO qui valide certains champs sur un formulaire et place automatiquement les e-mails jetables dans les champs appropriés (plus pour ma propre connaissance). Donc, si je DocumentComplete ceci:BHO Handle OnSubmit événement

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

Comment puis-je utiliser pour écouter l'interface IHTMLFormElement pour l'événement onsubmit?

+0

Il y a un tas de choses au sujet de votre code que je changerais. Premièrement: ne créez pas de nouveaux VARIANTES, déclarez-les simplement sur la pile et transmettez-les normalement. De toute façon, assurez-vous que vous appelez VariantClear() sur eux lorsque vous avez terminé avec eux afin qu'ils soient libérés correctement. Aussi, pensez à utiliser SUCCEEDED (hr) au lieu de S_OK! = R ... –

Répondre

1

Une fois que vous avez le pointeur sur l'élément que vous voulez couler des événements pour, vous QueryInterface() pour IConnectionPointContainer puis se connecter à ce:

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

Quelques notes:

  1. Vous voulez probablement mettre en cache dwCookie et cpc, puisque vous en avez besoin plus tard lorsque vous appelez pcp->Unadvise() pour déconnecter le récepteur.
  2. Dans l'appel à pcp->Advise() ci-dessus, je le transmets. Vous pouvez utiliser n'importe quel objet qui implémente IDispatch, qui peut être ou ne pas être cet objet. Design laissé à vous.
  3. riid sera l'événement dispinterface que vous voulez couler. Dans ce cas, vous voulez probablement DIID_HTMLFormElementEvents2.

Voici comment déconnecter:

pcp->Unadvise(dwCookie); 

Laissez-moi savoir si vous avez d'autres questions.

Edit-1:

Ouais, ce diid a eu tort. Il devrait être: DIID_HTMLFormElementEvents2.

Voici comment je l'ai trouvé:

C:\Program Files (x86)\Microsoft Visual Studio 8\VC\PlatformSDK>findstr /spin /c:"Events2" *.h | findstr /i /c:"form" 
+0

Merci beaucoup! Le seul problème que j'ai est que "DIID_HTMLFormEvents2" n'est déclaré nulle part. J'ai essayé de chercher google mais cela n'a rien apporté. Une idée de comment réparer ça? –

+0

J'ai mis à jour ma réponse pour corriger cela. –

Questions connexes