2009-09-13 44 views
2

基本上我想開發一個BHO來驗證表單上的某些字段,並在適當的字段中自動放置一次性電子郵件(更多用於我自己的知識)。所以在DocumentComplete事件我有這樣的:BHO處理OnSubmit事件

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

我將如何使用IHTMLFormElement接口來監聽onsubmit事件?

+0

有一堆關於你的代碼的事情,我會改變。首先:不要創建新的VARIANTS,只需在堆棧中聲明它們並正常傳遞它們即可。無論哪種方式,確保您在完成對它們的調用時調用VariantClear(),以便它們正確釋放。另外,考慮使用成功(小時)而不是S_OK!= r ... – 2009-09-13 18:50:39

回答

1

一旦你的指針要下沉了,你會QueryInterface()IConnectionPointContainer事件,然後連接到該元素:

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

一些注意事項:

  1. 你可能想以緩存dwCookiecpc,因爲稍後當您撥打pcp->Unadvise()來斷開接收器時需要它們。
  2. 在上面的電話pcp->Advise(),我通過這個。您可以使用任何實現IDispatch的對象,這些對象可以是也可以不是此對象。設計留給你。
  3. riid將是您想要下沉的事件調度接口。在這種情況下,您可能需要DIID_HTMLFormElementEvents2

以下是如何斷開:

pcp->Unadvise(dwCookie); 

讓我知道,如果你還有其他問題。

編輯-1:

是的,那個DIID是錯的。它應該是:DIID_HTMLFormElementEvents2

這是我如何找到它:

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

非常感謝!我遇到的唯一問題是「DIID_HTMLFormEvents2」沒有在任何地方聲明。我試圖搜索谷歌,但它沒有提出任何事情。任何想法如何解決這一問題? – 2009-09-13 19:34:50

+0

我更新了我的答案,以解決此問題。 – 2009-09-13 22:05:31