CDHtmlDialog 如何 屏蔽脚本错误

来源:互联网 发布:威露士极是洗发水 知乎 编辑:程序博客网 时间:2024/05/17 04:52

前言:

在Windows客户端程序中展示网页,以前常用CHtmlView。最近发现高版本VS中有CDHtmlDialog,试了一下,发现更好用。就只说 JS 与 C++ 代码互相调用方面,基本都是两三行语句搞定,是比CHtmlView方便了太多。

正文:

CDHtmlDialog 如何 屏蔽脚本错误呢?网上搜了下,有一种解决办法是这样的(CMyDialog是 自定义的CDHtmlDialog的子类):

BOOL CMyDialog::OnInitDialog(){  ...   m_pBrowserApp->put_Silent(VARIANT_TRUE);}

经测试,没有效果(win7 + vs2013)

网上搜了半天也尝试了很多,终于发现一个有效的办法。如果在web页面上,加上这一段:

<script type="text/javascript">       function MyErrorFunc(){        return true;    }     window.onerror = MyErrorFunc</script>
就能屏蔽脚本错误弹窗了。猜测这相当于用自己的实现重写web默认onerror函数。所以如果能在所有网页中加上这一段脚本,就能实现目的了。那客户端如何实现呢?

看代码

思路:在页面加载完毕(OnNavigateComplete)时,注入脚本(屏蔽报错)

void CMyDialog::OnNavigateComplete(LPDISPATCH pDisp, LPCTSTR szUrl){CDHtmlDialog::OnNavigateComplete(pDisp, szUrl);SuppressScriptError(); // 屏蔽脚本报错}void CMyDialog::SuppressScriptError(){// 要执行的屏蔽报错脚本CString strScript = _T("window.onerror=function myonerror(){return true}"); CString strLanguage("JavaScript");ExecuteScript(strScript, strLanguage);}void CMyDialog::ExecuteScript(CString &strScript, CString &strLanguage){IHTMLDocument2* pIHtmlDoc = NULL;GetDHtmlDocument(&pIHtmlDoc);if (!pIHtmlDoc) return;IHTMLWindow2* pIhtmlwindow2 = NULL;pIHtmlDoc->get_parentWindow(&pIhtmlwindow2);if (!pIhtmlwindow2) return;BSTR bstrScript = strScript.AllocSysString();BSTR bstrLanguage = strLanguage.AllocSysString();VARIANT pRet;// 注入脚本到当前页面pIhtmlwindow2->execScript(bstrScript, bstrLanguage, &pRet);::SysFreeString(bstrScript);::SysFreeString(bstrLanguage);pIhtmlwindow2->Release();}

经测试,有效(win7 + vs2013)

参考资料:https://www.douban.com/note/188909792/


原创粉丝点击