天天看點

ACTIVEX浏覽器控件如何防止彈出腳本錯誤

轉載自: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.}