轉載自:http://xjchilli.blog.163.com/blog/static/4534773920108188450277/
在IE浏覽器浏覽網頁時經常遇到腳本錯誤,IE的處理方法是在左下角狀态欄顯示一個黃色的感歎号。
但是在MFC對話框程式裡直接插入的ACTIVEX浏覽器控件裡,該腳本錯誤會直接彈出。
如何避免彈出該錯誤呢?
1.設定浏覽器控件的Silent屬性為True,直接在控件屬性裡設定。(用這個方法最簡單了)
或動态建立時設定。
p_WebBrowserCtrl1 = new CWebBrowser2;
p_WebBrowserCtrl1->Create("",WS_CHILD|WS_VISIBLE,rt,this,IDC_EXPLORER3);
p_WebBrowserCtrl1->SetSilent(0);
2.以上方法有一個缺點,就是普通正常的腳本視窗也彈不出來了。要想隻屏蔽錯誤視窗,可以在控件的NavigateComplete2響應函數中處理錯誤:
首先,建立錯誤處理類,可以單獨建立一個頭檔案,最後将頭檔案包含在主視窗中。
view source
print?
01.class ErrorHandler : public IDispatch
02.{
03.public:
04. STDMETHODIMP_(ULONG) AddRef(){return 1;}
05. STDMETHODIMP_(ULONG) Release(){return 0;}
06. STDMETHODIMP QueryInterface(REFIID iid, LPVOID* ppvObj)
07. {
08. *ppvObj = NULL;
09.
10. if(IsEqualIID(iid, IID_IUnknown) || IsEqualIID(iid, IID_IDispatch))
11. {
12. *ppvObj = this;
13. AddRef();
14. return S_OK;
15. }
16.
17. return E_NOINTERFACE;
18. }
19.
20. STDMETHODIMP GetTypeInfoCount(unsigned int*){return E_NOTIMPL;}
21. STDMETHODIMP GetTypeInfo(unsigned int, LCID, ITypeInfo**){return E_NOTIMPL;}
22. STDMETHODIMP GetIDsOfNames(REFIID, LPOLESTR*, unsigned int, LCID, DISPID*){return E_NOTIMPL;}
23.
24. STDMETHODIMP Invoke(DISPID dispid,
25. REFIID, LCID, unsigned short,
26. DISPPARAMS* pdispparams,
27. VARIANT* pvarResult,
28. EXCEPINFO*, unsigned int*)
29. {
30. // onerror處理
31. // pdispparams->rgvarg[0], error message
32. // pdispparams->rgvarg[1], url
33. // pdispparams->rgvarg[2], line
34.
35. pvarResult->vt = VT_BOOL;
36. pvarResult->boolVal = -1; // return true
37. return S_OK;
38. }
39.}m_dispErr;
然後在控件的NavigateComplete2函數中增加如下:
view source
print?
01.void XXXXDlg::NavigateComplete2Explorer1(LPDISPATCH pDisp, VARIANT* URL)
02.
03.{
04.IWebBrowser2 *thisBrowser = NULL;
05. IDispatch *docDisp = NULL;
06. IHTMLDocument2 *doc = NULL;
07. HRESULT hr = S_OK;
08.
09. docDisp = p_WebBrowserCtrl1->GetDocument();
10.
11. hr = docDisp->QueryInterface(IID_IHTMLDocument2, reinterpret_cast<void**>(&doc));
12. IHTMLWindow2 * pIhtmlwindow2 = NULL;
13. doc->get_parentWindow(&pIhtmlwindow2);
14.
15. VARIANT disp;
16. VariantInit(&disp);
17. disp.vt = VT_DISPATCH;
18. disp.pdispVal = &m_dispErr; // dispatcher object
19. pIhtmlwindow2->put_onerror(disp);
20.}