转载自: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.}