使用CWebbrowser怎么禁止脚本运行

weisite 2008-05-14 06:22:03
我使用CWebbrowser2控件,想要禁止html文档里的脚本运行。我实现了IDocHostUIHandler接口,在GetHostInfo中:
pInfo->dwFlags = DOCHOSTUIFLAG_NO3DBORDER | DOCHOSTUIFLAG_SCROLL_NO;
可以实现取消3D边框和滚动条,可是使用DOCHOSTUIFLAG_DISABLE_SCRIPT_INACTIVE却不可以禁止脚本,请问是为什么?
...全文
给本帖投票
884 23 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
weisite 2008-05-16
  • 打赏
  • 举报
回复
调用了啊,可是CWebbrowser2的OnAmbientProperty还是没有执行。
不过我重载了对话框的OnAmbientProperty后,可以解决这个问题。能不能解释一下为什么啊?
jameshooo 2008-05-16
  • 打赏
  • 举报
回复
在InitInstance里面调用了AfxEnableControlContainer吗?
weisite 2008-05-16
  • 打赏
  • 举报
回复
为什么我在CWebbrowser2中添加了OnAmbientProperty,却没有被执行??
jameshooo 2008-05-16
  • 打赏
  • 举报
回复
MFC更简单,从CWebbrowser2继承一个类,或者直接修改CWebbrowser2类(假设它不是MFC提供的话),重载virtual BOOL OnAmbientProperty(COleControlSite* pSite, DISPID dispid, VARIANT* pvar) 函数,判断dispid==DISPID_AMBIENT_DLCONTROL时,设置pvar的值即可。

virtual BOOL OnAmbientProperty(COleControlSite* pSite, DISPID dispid, VARIANT* pvar)
{
if (dispid==DISPID_AMBIENT_DLCONTROL)
{
V_VT(pvar) = VT_I4;
V_I4(pvar) = DLCTL_NO_SCRIPTS; // 还可以加上其它的限制标志
return TRUE;
}
return CWnd::OnAmbientProperty(pSite,dispid,pvar);
}

weisite 2008-05-16
  • 打赏
  • 举报
回复
void CWebBrowser2::Stop()
{
InvokeHelper(0x6a, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
}

LPDISPATCH CWebBrowser2::GetApplication()
{
LPDISPATCH result;
InvokeHelper(0xc8, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
return result;
}

LPDISPATCH CWebBrowser2::GetParent()
{
LPDISPATCH result;
InvokeHelper(0xc9, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
return result;
}

LPDISPATCH CWebBrowser2::GetContainer()
{
LPDISPATCH result;
InvokeHelper(0xca, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
return result;
}

LPDISPATCH CWebBrowser2::GetDocument()
{
LPDISPATCH result;
InvokeHelper(0xcb, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
return result;
}

BOOL CWebBrowser2::GetTopLevelContainer()
{
BOOL result;
InvokeHelper(0xcc, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
return result;
}

CString CWebBrowser2::GetType()
{
CString result;
InvokeHelper(0xcd, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL);
return result;
}

long CWebBrowser2::GetLeft()
{
long result;
InvokeHelper(0xce, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
return result;
}

void CWebBrowser2::SetLeft(long nNewValue)
{
static BYTE parms[] =
VTS_I4;
InvokeHelper(0xce, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
nNewValue);
}

long CWebBrowser2::GetTop()
{
long result;
InvokeHelper(0xcf, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
return result;
}

void CWebBrowser2::SetTop(long nNewValue)
{
static BYTE parms[] =
VTS_I4;
InvokeHelper(0xcf, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
nNewValue);
}

long CWebBrowser2::GetWidth()
{
long result;
InvokeHelper(0xd0, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
return result;
}

void CWebBrowser2::SetWidth(long nNewValue)
{
static BYTE parms[] =
VTS_I4;
InvokeHelper(0xd0, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
nNewValue);
}

long CWebBrowser2::GetHeight()
{
long result;
InvokeHelper(0xd1, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
return result;
}

void CWebBrowser2::SetHeight(long nNewValue)
{
static BYTE parms[] =
VTS_I4;
InvokeHelper(0xd1, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
nNewValue);
}

CString CWebBrowser2::GetLocationName()
{
CString result;
InvokeHelper(0xd2, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL);
return result;
}

CString CWebBrowser2::GetLocationURL()
{
CString result;
InvokeHelper(0xd3, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL);
return result;
}

BOOL CWebBrowser2::GetBusy()
{
BOOL result;
InvokeHelper(0xd4, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
return result;
}

void CWebBrowser2::Quit()
{
InvokeHelper(0x12c, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
}

void CWebBrowser2::ClientToWindow(long* pcx, long* pcy)
{
static BYTE parms[] =
VTS_PI4 VTS_PI4;
InvokeHelper(0x12d, DISPATCH_METHOD, VT_EMPTY, NULL, parms,
pcx, pcy);
}

void CWebBrowser2::PutProperty(LPCTSTR Property_, const VARIANT& vtValue)
{
static BYTE parms[] =
VTS_BSTR VTS_VARIANT;
InvokeHelper(0x12e, DISPATCH_METHOD, VT_EMPTY, NULL, parms,
Property_, &vtValue);
}

VARIANT CWebBrowser2::GetProperty_(LPCTSTR Property_)
{
VARIANT result;
static BYTE parms[] =
VTS_BSTR;
InvokeHelper(0x12f, DISPATCH_METHOD, VT_VARIANT, (void*)&result, parms,
Property_);
return result;
}

CString CWebBrowser2::GetName()
{
CString result;
InvokeHelper(0x0, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL);
return result;
}

long CWebBrowser2::GetHwnd()
{
long result;
InvokeHelper(DISPID_HWND, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
return result;
}

CString CWebBrowser2::GetFullName()
{
CString result;
InvokeHelper(0x190, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL);
return result;
}

CString CWebBrowser2::GetPath()
{
CString result;
InvokeHelper(0x191, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL);
return result;
}

BOOL CWebBrowser2::GetVisible()
{
BOOL result;
InvokeHelper(0x192, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
return result;
}

void CWebBrowser2::SetVisible(BOOL bNewValue)
{
static BYTE parms[] =
VTS_BOOL;
InvokeHelper(0x192, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
bNewValue);
}

BOOL CWebBrowser2::GetStatusBar()
{
BOOL result;
InvokeHelper(0x193, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
return result;
}

void CWebBrowser2::SetStatusBar(BOOL bNewValue)
{
static BYTE parms[] =
VTS_BOOL;
InvokeHelper(0x193, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
bNewValue);
}
weisite 2008-05-16
  • 打赏
  • 举报
回复
////////////////////////////////////////////////////////////
//实现如下
// Machine generated IDispatch wrapper class(es) created by Microsoft Visual C++

// NOTE: Do not modify the contents of this file. If this class is regenerated by
// Microsoft Visual C++, your modifications will be overwritten.


#include "stdafx.h"
#include "webbrowser2.h"

/////////////////////////////////////////////////////////////////////////////
// CWebBrowser2

IMPLEMENT_DYNCREATE(CWebBrowser2, CWnd)

/////////////////////////////////////////////////////////////////////////////
// CWebBrowser2 properties

/////////////////////////////////////////////////////////////////////////////
// CWebBrowser2 operations

void CWebBrowser2::GoBack()
{
InvokeHelper(0x64, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
}

void CWebBrowser2::GoForward()
{
InvokeHelper(0x65, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
}

void CWebBrowser2::GoHome()
{
InvokeHelper(0x66, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
}

void CWebBrowser2::GoSearch()
{
InvokeHelper(0x67, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
}

void CWebBrowser2::Navigate(LPCTSTR URL, VARIANT* Flags, VARIANT* TargetFrameName, VARIANT* PostData, VARIANT* Headers)
{
static BYTE parms[] =
VTS_BSTR VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT;
InvokeHelper(0x68, DISPATCH_METHOD, VT_EMPTY, NULL, parms,
URL, Flags, TargetFrameName, PostData, Headers);
}

void CWebBrowser2::Refresh()
{
InvokeHelper(DISPID_REFRESH, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
}

void CWebBrowser2::Refresh2(VARIANT* Level)
{
static BYTE parms[] =
VTS_PVARIANT;
InvokeHelper(0x69, DISPATCH_METHOD, VT_EMPTY, NULL, parms,
Level);
}

weisite 2008-05-16
  • 打赏
  • 举报
回复
实际上就是MS提供的CWebbrowser2类,代码如下:
class CWebBrowser2 : public CWnd
{
protected:
DECLARE_DYNCREATE(CWebBrowser2)
public:
CLSID const& GetClsid()
{
static CLSID const clsid
= { 0x8856f961, 0x340a, 0x11d0, { 0xa9, 0x6b, 0x0, 0xc0, 0x4f, 0xd7, 0x5, 0xa2 } };
return clsid;
}
virtual BOOL Create(LPCTSTR lpszClassName,
LPCTSTR lpszWindowName, DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd, UINT nID,
CCreateContext* pContext = NULL)
{ return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID); }

BOOL Create(LPCTSTR lpszWindowName, DWORD dwStyle,
const RECT& rect, CWnd* pParentWnd, UINT nID,
CFile* pPersist = NULL, BOOL bStorage = FALSE,
BSTR bstrLicKey = NULL)
{ return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID,
pPersist, bStorage, bstrLicKey); }

// Attributes
public:

// Operations
public:
void GoBack();
void GoForward();
void GoHome();
void GoSearch();
void Navigate(LPCTSTR URL, VARIANT* Flags, VARIANT* TargetFrameName, VARIANT* PostData, VARIANT* Headers);
void Refresh();
void Refresh2(VARIANT* Level);
void Stop();
LPDISPATCH GetApplication();
LPDISPATCH GetParent();
LPDISPATCH GetContainer();
LPDISPATCH GetDocument();
BOOL GetTopLevelContainer();
CString GetType();
long GetLeft();
void SetLeft(long nNewValue);
long GetTop();
void SetTop(long nNewValue);
long GetWidth();
void SetWidth(long nNewValue);
long GetHeight();
void SetHeight(long nNewValue);
CString GetLocationName();
CString GetLocationURL();
BOOL GetBusy();
void Quit();
void ClientToWindow(long* pcx, long* pcy);
void PutProperty(LPCTSTR Property_, const VARIANT& vtValue);
VARIANT GetProperty_(LPCTSTR Property_);
CString GetName();
long GetHwnd();
CString GetFullName();
CString GetPath();
BOOL GetVisible();
void SetVisible(BOOL bNewValue);
BOOL GetStatusBar();
void SetStatusBar(BOOL bNewValue);
CString GetStatusText();
void SetStatusText(LPCTSTR lpszNewValue);
long GetToolBar();
void SetToolBar(long nNewValue);
BOOL GetMenuBar();
void SetMenuBar(BOOL bNewValue);
BOOL GetFullScreen();
void SetFullScreen(BOOL bNewValue);
void Navigate2(VARIANT* URL, VARIANT* Flags, VARIANT* TargetFrameName, VARIANT* PostData, VARIANT* Headers);
long QueryStatusWB(long cmdID);
void ExecWB(long cmdID, long cmdexecopt, VARIANT* pvaIn, VARIANT* pvaOut);
void ShowBrowserBar(VARIANT* pvaClsid, VARIANT* pvarShow, VARIANT* pvarSize);
long GetReadyState();
BOOL GetOffline();
void SetOffline(BOOL bNewValue);
BOOL GetSilent();
void SetSilent(BOOL bNewValue);
BOOL GetRegisterAsBrowser();
void SetRegisterAsBrowser(BOOL bNewValue);
BOOL GetRegisterAsDropTarget();
void SetRegisterAsDropTarget(BOOL bNewValue);
BOOL GetTheaterMode();
void SetTheaterMode(BOOL bNewValue);
BOOL GetAddressBar();
void SetAddressBar(BOOL bNewValue);
BOOL GetResizable();
void SetResizable(BOOL bNewValue);
};
weisite 2008-05-16
  • 打赏
  • 举报
回复
好,多谢了,结贴!!
jameshooo 2008-05-16
  • 打赏
  • 举报
回复
对,容纳控件的窗口
weisite 2008-05-16
  • 打赏
  • 举报
回复
是不是加入控件的那个窗口?我是在资源里面加入CWebbrowser控件的。
jameshooo 2008-05-16
  • 打赏
  • 举报
回复
那是对话框本身实现了容器接口,直接调用对话框的OnAmbientProperty去了,所以CWebBrowser2就没机会执行了。关键是要找到是哪个窗口类实现了容器接口。
jameshooo 2008-05-15
  • 打赏
  • 举报
回复
CWebBrowser2是哪来的?
weisite 2008-05-15
  • 打赏
  • 举报
回复
能给个例子吗?我试了好像不行,没有执行dispatch接口的Invoke。
jameshooo 2008-05-15
  • 打赏
  • 举报
回复
不用做任何联系,这个dispatch接口实现在你的容器中,会被浏览器控件自动调用的
weisite 2008-05-15
  • 打赏
  • 举报
回复
to jameshooo :
谢谢啊!可以给出一个比较完整的例子吗?我不是很明白,比如你说的“在实现IDocHostUIHandler的类里面需要实现一个IDispatch接口”,我实现了这个接口后怎么和CWebbrowser控件产生联系呢?
jameshooo 2008-05-15
  • 打赏
  • 举报
回复
IDocHostUIHandler仅仅处理UI方面的东西,不能用它禁止脚本。
如果禁止脚本下载(当然也无法运行),就用DISPID_AMBIENT_DLCONTROL方法。
还有更多控制浏览器行为的标志用CoInternetSetFeatureEnabled来设置。
weisite 2008-05-15
  • 打赏
  • 举报
回复
能否说得更详细一下?是使用GetHostInfo无法做到禁止脚本运行吗?
jameshooo 2008-05-15
  • 打赏
  • 举报
回复
宿主是容器,不是指窗口。你先看看CWebbrowser2类都继承了哪些基类,把所有基类都贴出来,因为我不知道CWebbrowser2都干了些什么,是否已经实现了容器
weisite 2008-05-15
  • 打赏
  • 举报
回复
大伙帮帮忙啊!!!!!!
我在msdn上看到说,需要实现宿主的IDispatch接口,使得它处理DISPID_AMBIENT_DLCONTROL。可是CWebbrowser控件的宿主指的是什么?是它所在的对话框吗?
weisite 2008-05-15
  • 打赏
  • 举报
回复
不是ATL,我是在一个对话框上加入WebBrowser控件,希望能够在该控件在载入网页的时候禁止运行网页里的脚本。
加载更多回复(3)

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧

手机看
关注公众号

关注公众号

客服 返回
顶部