ACTIVEX浏览器控件如何防止弹出脚本错误

来源:互联网 发布:淘宝网有线麦克风话筒 编辑:程序博客网 时间:2024/05/22 11:52

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

原创粉丝点击