首先在CHtmlView派生的子类中重写OnAmbientProperty事件。
实现代码如下:
01 | BOOL CMyHtmlView::OnAmbientProperty(COleControlSite* pSite, DISPID dispid, VARIANT* pvar) |
04 |
if (dispid == DISPID_AMBIENT_DLCONTROL) |
07 |
pvar->iVal = DLCTL_NO_SCRIPTS; |
10 |
return CHtmlView::OnAmbientProperty(pSite, dispid, pvar); |
pvar->iVal后面的参数解释如下:
DLCTL_BGSOUNDS 浏览器组件播放同文档相联的背景声音;
DLCTL_DLIMAGES 浏览器组件从服务器下载图形;
DLCTL_DOWNLOADONLY 浏览器组件下载页面但不显示;
DLCTL_FORCEOFFLINE 浏览器组件工作在脱机方式。通过 URLMON 提出请求时, 即使计算机连接了互联网,也设置 BINDF_OFFLINEOPERATION 标志;
DLCTL_NO_BEHAVIORS 浏览器组件不执行任何行为;
DLCTL_NO_CLIENTPULL 浏览器组件不执行任何客户端的 pull 操作;
DLCTL_NO_DLACTIVEXCTLS 浏览器组件不下载文档中的任何 ActiveX 控件;
DLCTL_NO_FRAMEDOWNLOAD 浏览器组件对包含框架的页面进行语法分析但不下载任何帧, 同时忽略框架,不翻译任何 frame 标记;
DLCTL_NO_JAVA浏览器组件不执行任何 Java applet;
DLCTL_NO_METACHARSET 浏览器组件隐藏文档中的 META 元素指示的字符集;
DLCTL_NO_RUNACTIVEXCTLS 浏览器组件不执行文档中的任何 ActiveX 控件;
DLCTL_NO_SCRIPTS 浏览器组件不执行任何脚本;
DLCTL_OFFLINE 与 DLCTL_OFFLINEIFNOTCONNECTED 相同;
DLCTL_OFFLINEIFNOTCONNECTED 如果未连接互联网,浏览器组件将以脱机方式工作。通过URLMON 提出请求时,即使计算机连接了互联网,也设置 BINDF_GETFROMCACHE_IF_NET_FAIL 标志;
DLCTL_PRAGMA_NO_CACHE 浏览器组件迫使请求发送给服务器并忽略代理,即使代理指明 数据是最新的也是如此。通过 URLMON 提出请求时,设置 BINDF_PRAGMA_NO_CACHE 标志;
DLCTL_RESYNCHRONIZE 浏览器组件忽略缓存中的数据并向服务器请求更新。如果服务器指明 缓存中的数据是更新了的则使用缓存数据。通过 URLMON 提出 请求时,设置BINDF_RESYNCHRONIZE 标志;
DLCTL_SILENT 浏览器组件不显示用户界面。通过 URLMON 提出请求时,设置BINDF_SILENTOPERATION 标志;
DLCTL_URL_ENCODING_DISABLE_UTF8 浏览器组件禁止 UTF-8 编码;
DLCTL_URL_ENCODING_ENABLE_UTF8 浏览器组件允许 UTF-8 编码;
DLCTL_VIDEOS 浏览器组件播放文档中包含的视频片断。
屏蔽JS脚本执行:
void C******View::OnNavigateComplete2(LPCTSTR strURL)
{
// TODO: Add your specialized code here and/or call the base class
CComPtr<IDispatch> spDisp = GetHtmlDocument();
if(spDisp!=NULL)
{
CComPtr<IHTMLDocument2> doc;
spDisp->QueryInterface(IID_IHTMLDocument2, reinterpret_cast<void**>(&doc));
if(doc != NULL)
{
IHTMLWindow2 * pIhtmlwindow2 = NULL;
doc->get_parentWindow(&pIhtmlwindow2);
if(pIhtmlwindow2 != NULL)
{//”function fnOnError(msg,url,lineno){alert(‘script error:\\n\\nURL:’+url+’\\n\\nMSG:’+msg +’\\n\\nLine:’+lineno);return true;}window.οnerrοr=fnOnError;”;
//屏蔽javascript脚本错误的javascript脚本
CString strJavaScriptCode = “function fnOnError(){return true;}window.οnerrοr=fnOnError;”;
BSTR bstrScript = strJavaScriptCode.AllocSysString();
CString strLanguage(“JavaScript”);
BSTR bstrLanguage = strLanguage.AllocSysString();
long lTime = 1 * 1000;
long lTimeID = 0;
VARIANT varLanguage;
varLanguage.vt = VT_BSTR;
varLanguage.bstrVal = bstrLanguage;
VARIANT pRet;
//把window.onerror函数插入入当前页面中去
pIhtmlwindow2->execScript(bstrScript, bstrLanguage, &pRet);
::SysFreeString(bstrScript);
::SysFreeString(bstrLanguage);
pIhtmlwindow2->Release();
}
}
}
CHtmlView::OnNavigateComplete2(strURL);
}
以及:
void C*******View::OnBeforeNavigate2(LPCTSTR lpszURL, DWORD nFlags, LPCTSTR lpszTargetFrameName, CByteArray& baPostedData, LPCTSTR lpszHeaders, BOOL* pbCancel)
{
// TODO: Add your specialized code here and/or call the base class
SetSilent(true);
CHtmlView::OnBeforeNavigate2(lpszURL, nFlags, lpszTargetFrameName, baPostedData, lpszHeaders, pbCancel);
}