我使用CWebbrowser2控件,想要禁止html文档里的脚本运行。我实现了IDocHostUIHandler接口,在GetHostInfo中:
pInfo->dwFlags = DOCHOSTUIFLAG_NO3DBORDER | DOCHOSTUIFLAG_SCROLL_NO;
可以实现取消3D边框和滚动条,可是使用DOCHOSTUIFLAG_DISABLE_SCRIPT_INACTIVE却不可以禁止脚本,请问是为什么?

解决方案 »

  1.   

    在实现IDocHostUIHandler的类里面需要实现一个IDispatch接口,在Invoke里面直接处理dispid==DISPID_AMBIENT_DLCONTROL的情况,返回的值类型是LONG型,必须包含DLCTL_NO_SCRIPTS标志,大概像这样:STDMETHOD(Invoke)(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS * pdispparams, VARIANT *pVarResult, EXCEPINFO * pExcepInfo, UINT * puArgErr)
    {
      if (dispIdMember==DISPID_AMBIENT_DLCONTROL)
      {
        V_VT(pVarResult) = VT_I4;
        V_I4(pVarResult) = DLCTL_NO_SCRIPTS; // 还可以加上其它的限制标志
        return S_OK;
      }
    }
      

  2.   

    能否说得更详细一下?是使用GetHostInfo无法做到禁止脚本运行吗?
      

  3.   

    IDocHostUIHandler仅仅处理UI方面的东西,不能用它禁止脚本。
    如果禁止脚本下载(当然也无法运行),就用DISPID_AMBIENT_DLCONTROL方法。
    还有更多控制浏览器行为的标志用CoInternetSetFeatureEnabled来设置。
      

  4.   

    to jameshooo :
    谢谢啊!可以给出一个比较完整的例子吗?我不是很明白,比如你说的“在实现IDocHostUIHandler的类里面需要实现一个IDispatch接口”,我实现了这个接口后怎么和CWebbrowser控件产生联系呢?
      

  5.   

    不用做任何联系,这个dispatch接口实现在你的容器中,会被浏览器控件自动调用的
      

  6.   

    能给个例子吗?我试了好像不行,没有执行dispatch接口的Invoke。
      

  7.   

    CWebBrowser2是插入的控件啊,直接在窗体上。我直接继承IDispatch接口,然后在IDocHostUIHandler接口类中添加WBEventDispatch的一个指针,再分配内存,这样可以吗?可以没有执行WBEventDispatch的Invoke。
    class WBEventDispatch : public IDispatch
    {
    public:
    long refcount;
        WBEventDispatch();
        ~WBEventDispatch();    // IUnknown
        STDMETHODIMP QueryInterface(REFIID iid, void ** ppvObject);
        ULONG STDMETHODCALLTYPE AddRef();
        ULONG STDMETHODCALLTYPE Release();    // IDispatch
        STDMETHODIMP GetTypeInfoCount(unsigned int FAR* pctinfo);
        STDMETHODIMP GetTypeInfo(unsigned int iTInfo, LCID  lcid,
                                              ITypeInfo FAR* FAR*  ppTInfo);
        STDMETHODIMP GetIDsOfNames(REFIID riid, OLECHAR FAR* FAR* rgszNames,
                                                unsigned int cNames, LCID lcid, DISPID FAR* rgDispId);
        STDMETHODIMP Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags,
                                         DISPPARAMS FAR* pDispParams, VARIANT FAR* parResult,
                                         EXCEPINFO FAR* pExcepInfo, unsigned int FAR* puArgErr);
    };
      

  8.   

    不会去调用IDocHostUIHandler的Invoke,是Container的Invoke。也就是
    IOleClientSite::GetContainer这个函数传给控件的Container的接口所能queryinterface到的IDispatch如果是ATL最简单的方法如下:1 复制atlhost.h成自己想要的名字,比如Zr.h
    2 复制atl的IDispatchImpl成自己想要的名字,比如IZrDispatchImpl;
    3 在IZrDispatchImpl的Invoke里加入:
    if (dispidMember==DISPID_AMBIENT_DLCONTROL){
                    //你改成自己的代码
    ATLTRACE(L"DISPID_AMBIENT_DLCONTROL");
    }
    4 在Zr.h里修改
      class ATL_NO_VTABLE CAxHostWindow
        ......
        IDispatchImpl<IAxWinAmbientDispatch...成IZrDispatchImpl<IAx.....
    5 在以前需要include <atlhost.h>的地方,替换成include这个Zr.h
      

  9.   

    不是ATL,我是在一个对话框上加入WebBrowser控件,希望能够在该控件在载入网页的时候禁止运行网页里的脚本。
      

  10.   

    大伙帮帮忙啊!!!!!!
    我在msdn上看到说,需要实现宿主的IDispatch接口,使得它处理DISPID_AMBIENT_DLCONTROL。可是CWebbrowser控件的宿主指的是什么?是它所在的对话框吗?
      

  11.   

    宿主是容器,不是指窗口。你先看看CWebbrowser2类都继承了哪些基类,把所有基类都贴出来,因为我不知道CWebbrowser2都干了些什么,是否已经实现了容器
      

  12.   

    实际上就是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);
    };
      

  13.   

    ////////////////////////////////////////////////////////////
    //实现如下
    // 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"/////////////////////////////////////////////////////////////////////////////
    // CWebBrowser2IMPLEMENT_DYNCREATE(CWebBrowser2, CWnd)/////////////////////////////////////////////////////////////////////////////
    // CWebBrowser2 properties/////////////////////////////////////////////////////////////////////////////
    // CWebBrowser2 operationsvoid 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);
    }
      

  14.   

    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);
    }
      

  15.   

    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);
    }
      

  16.   

    为什么我在CWebbrowser2中添加了OnAmbientProperty,却没有被执行??
      

  17.   

    在InitInstance里面调用了AfxEnableControlContainer吗?
      

  18.   

    调用了啊,可是CWebbrowser2的OnAmbientProperty还是没有执行。
    不过我重载了对话框的OnAmbientProperty后,可以解决这个问题。能不能解释一下为什么啊?
      

  19.   

    那是对话框本身实现了容器接口,直接调用对话框的OnAmbientProperty去了,所以CWebBrowser2就没机会执行了。关键是要找到是哪个窗口类实现了容器接口。
      

  20.   

    是不是加入控件的那个窗口?我是在资源里面加入CWebbrowser控件的。