`
SmartGeek
  • 浏览: 71672 次
  • 来自: 南京
社区版块
存档分类

WebBrowser控件如何屏蔽javascript错误

 
阅读更多

WebBrowser 如何屏蔽javascript错误,我搜啊搜啊,搜到了

http://www.cnblogs.com/zhangqingping/archive/2009/06/16/1504260.html 和 http://support.microsoft.com/kb/261003

http://www.codeproject.com/Articles/4003/Popup-Window-Blocker

 

#pragma once
                     
#include <mshtmhst.h>
                     
class CNoScriptErrorHelper
    : public IDocHostUIHandler
    , public IOleCommandTarget
{
                     
public:     
    HRESULT STDMETHODCALLTYPE SetHandler(CComPtr<IWebBrowser2> spWebBrowser)
    {
        HRESULT result = E_NOINTERFACE;
        CComPtr<IDispatch> spDisp;
        HRESULT hr = spWebBrowser->get_Document(&spDisp);
        if (SUCCEEDED(hr) && spDisp)
        {
            // If this is not an HTML document (e.g., it's a Word doc or a PDF), don't sink.
            CComQIPtr<IHTMLDocument2, &IID_IHTMLDocument2> spHTML(spDisp);
            if (spHTML)
            {
                // Get pointers to default interfaces
                CComQIPtr<IOleObject, &IID_IOleObject> spOleObject(spDisp);
                if (spOleObject)
                {
                    CComPtr<IOleClientSite> spClientSite;
                    hr = spOleObject->GetClientSite(&spClientSite);
                    if (SUCCEEDED(hr) && spClientSite)
                    {
                        m_spDefaultDocHostUIHandler = spClientSite;
                        m_spDefaultOleCommandTarget = spClientSite;
                    }
                }
                     
                // Set this class to be the IDocHostUIHandler
                CComQIPtr<ICustomDoc, &IID_ICustomDoc> spCustomDoc(spDisp);
                if (spCustomDoc) 
                {
                    spCustomDoc->SetUIHandler(this);
                    result = S_OK;
                }
            }
        } 
        return result;
    }
public:
    HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject)
    {
        HRESULT result = S_OK;
                     
        if (IsBadWritePtr(ppvObject, sizeof(LPVOID)))
            result = E_INVALIDARG;
                     
        if (result == S_OK)
        {
            *ppvObject = NULL;
                     
            if ( IsEqualIID( riid, IID_IUnknown ) )
                *ppvObject = this;
            else if ( IsEqualIID( riid, IID_IDispatch ) )
                             *ppvObject = (IDispatch *) this;
            else if ( IsEqualIID( riid, IID_IDocHostUIHandler ) )
                *ppvObject = (IDocHostUIHandler *) this;
            else if ( IsEqualIID( riid, IID_IOleCommandTarget ) )
                *ppvObject = (IOleCommandTarget *) this;
            else
                result = E_NOINTERFACE;
        }
                     
        if (result == S_OK)
            this->AddRef();
                     
        return result;
    }
                     
    ULONG STDMETHODCALLTYPE AddRef(){
        InterlockedIncrement(&m_cRef);
        return m_cRef;
    }
                     
    ULONG STDMETHODCALLTYPE Release() {
        ULONG ulRefCount = InterlockedDecrement(&m_cRef);
        if(m_cRef == 0)
        {
            delete this;
        }
        return ulRefCount;
    }
                     
                     
    STDMETHOD(ShowContextMenu)(DWORD dwID, POINT FAR* ppt, IUnknown FAR* pcmdTarget, IDispatch FAR* pdispReserved)
    {
        if (m_spDefaultDocHostUIHandler)
            return m_spDefaultDocHostUIHandler->ShowContextMenu(dwID, ppt, pcmdTarget, pdispReserved);
        return S_FALSE;
    }
                     
    STDMETHOD(ShowUI)(DWORD dwID, IOleInPlaceActiveObject FAR* pActiveObject,
                      IOleCommandTarget FAR* pCommandTarget,
                      IOleInPlaceFrame  FAR* pFrame,
                      IOleInPlaceUIWindow FAR* pDoc)
    {
        if (m_spDefaultDocHostUIHandler)
            return m_spDefaultDocHostUIHandler->ShowUI(dwID, pActiveObject, pCommandTarget, pFrame, pDoc);
        return S_FALSE;
    }
                     
    STDMETHOD(GetHostInfo)(DOCHOSTUIINFO FAR *pInfo)
    {
        if (m_spDefaultDocHostUIHandler)
            return m_spDefaultDocHostUIHandler->GetHostInfo(pInfo);
        return S_OK;
    }
                     
    STDMETHOD(HideUI)(void)
    {
        if (m_spDefaultDocHostUIHandler)
            return m_spDefaultDocHostUIHandler->HideUI();
        return S_OK;
    }
                     
    STDMETHOD(UpdateUI)(void)
    {
        if (m_spDefaultDocHostUIHandler)
            return m_spDefaultDocHostUIHandler->UpdateUI();
        return S_OK;
    }
                     
    STDMETHOD(EnableModeless)(BOOL fEnable)
    {
        if (m_spDefaultDocHostUIHandler)
            return m_spDefaultDocHostUIHandler->EnableModeless(fEnable);
        return S_OK;
    }
                     
    STDMETHOD(OnDocWindowActivate)(BOOL fActivate)
    {
        if (m_spDefaultDocHostUIHandler)
            return m_spDefaultDocHostUIHandler->OnDocWindowActivate(fActivate);
        return S_OK;
    }
                     
    STDMETHOD(OnFrameWindowActivate)(BOOL fActivate)
    {
        if (m_spDefaultDocHostUIHandler)
            return m_spDefaultDocHostUIHandler->OnFrameWindowActivate(fActivate);
        return S_OK;
    }
                     
    STDMETHOD(ResizeBorder)(LPCRECT prcBorder, IOleInPlaceUIWindow FAR* pUIWindow, BOOL fFrameWindow)
    {
        if (m_spDefaultDocHostUIHandler)
            return m_spDefaultDocHostUIHandler->ResizeBorder(prcBorder, pUIWindow, fFrameWindow);
        return S_OK;
    }
                     
    STDMETHOD(TranslateAccelerator)(LPMSG lpMsg, const GUID FAR* pguidCmdGroup, DWORD nCmdID)
    {
        if (m_spDefaultDocHostUIHandler)
            return m_spDefaultDocHostUIHandler->TranslateAccelerator(lpMsg, pguidCmdGroup, nCmdID);
        return E_NOTIMPL;
    }
                     
    STDMETHOD(GetOptionKeyPath)(LPOLESTR FAR* pchKey, DWORD dw)
    {
        if (m_spDefaultDocHostUIHandler)
            return m_spDefaultDocHostUIHandler->GetOptionKeyPath(pchKey, dw);
        return E_FAIL;
    }
                     
    STDMETHOD(GetDropTarget)(IDropTarget* pDropTarget, IDropTarget** ppDropTarget)
    {
        if (m_spDefaultDocHostUIHandler)
            return m_spDefaultDocHostUIHandler->GetDropTarget(pDropTarget, ppDropTarget);
        return S_OK;
    }
                     
    STDMETHOD(GetExternal)(IDispatch** ppDispatch)
    {
        if (m_spDefaultDocHostUIHandler)
            return m_spDefaultDocHostUIHandler->GetExternal(ppDispatch);
        return S_FALSE;
    }
                     
    STDMETHOD(TranslateUrl)(DWORD dwTranslate, OLECHAR* pchURLIn, OLECHAR** ppchURLOut)
    {
        if (m_spDefaultDocHostUIHandler)
            return m_spDefaultDocHostUIHandler->TranslateUrl(dwTranslate, pchURLIn, ppchURLOut);
        return S_FALSE;
    }
                     
    STDMETHOD(FilterDataObject)(IDataObject* pDO, IDataObject** ppDORet)
    {
        if (m_spDefaultDocHostUIHandler)
            return m_spDefaultDocHostUIHandler->FilterDataObject(pDO, ppDORet);
        return S_FALSE;
    }
                     
    //
    // IOleCommandTarget
    //
    STDMETHOD(QueryStatus)(
        /*[in]*/ const GUID *pguidCmdGroup, 
        /*[in]*/ ULONG cCmds,
        /*[in,out][size_is(cCmds)]*/ OLECMD *prgCmds,
        /*[in,out]*/ OLECMDTEXT *pCmdText)
    {
        return m_spDefaultOleCommandTarget->QueryStatus(pguidCmdGroup, cCmds, prgCmds, pCmdText);
    }
    STDMETHOD(Exec)(
        /*[in]*/ const GUID *pguidCmdGroup,
        /*[in]*/ DWORD nCmdID,
        /*[in]*/ DWORD nCmdExecOpt,
        /*[in]*/ VARIANTARG *pvaIn,
        /*[in,out]*/ VARIANTARG *pvaOut)
    {
        if (nCmdID == OLECMDID_SHOWSCRIPTERROR)
        {
            // Don't show the error dialog, but
            // continue running scripts on the page.
            (*pvaOut).vt = VT_BOOL;
            (*pvaOut).boolVal = VARIANT_TRUE;
            return S_OK;
        }
        return m_spDefaultOleCommandTarget->Exec(pguidCmdGroup, nCmdID, nCmdExecOpt, pvaIn, pvaOut);
    }
private:
    // Default interface pointers
    CComQIPtr<IDocHostUIHandler, &IID_IDocHostUIHandler> m_spDefaultDocHostUIHandler;
    CComQIPtr<IOleCommandTarget, &IID_IOleCommandTarget> m_spDefaultOleCommandTarget;
    LONG m_cRef;
};

 使用方法:

 

class CBrowserView
	: public CWindowImpl<CBrowserView, CAxWindow>
	, public IDispEventImpl<_nDispatchID, CBrowserView, &DIID_DWebBrowserEvents2>
{
public:
    DECLARE_WND_SUPERCLASS(_T("BrowserView"), CAxWindow::GetWndClassName())
    CNoScriptErrorHelper m_helper;
    BEGIN_SINK_MAP(CBrowserView)
        SINK_ENTRY_EX(_nDispatchID, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnEventDocumentComplete)
    END_SINK_MAP()
    void __stdcall OnEventDocumentComplete(IDispatch* pDisp, VARIANT* URL)
    {
        CComQIPtr<IWebBrowser2, &IID_IWebBrowser2> iwebBrowser(pDisp);
        m_helper.SetHandler(iwebBrowser);
    }
// Message map and handlers
    BEGIN_MSG_MAP(CBrowserView)
        MESSAGE_HANDLER(WM_CREATE, OnCreate)
        MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
    END_MSG_MAP()
    LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
    {
        LRESULT lRet = DefWindowProc(uMsg, wParam, lParam);

        // Connect events
        CComPtr spWebBrowser2;
        HRESULT hRet = QueryControl(IID_IWebBrowser2, (void**)&spWebBrowser2);
        if(SUCCEEDED(hRet))
        {
            if(FAILED(DispEventAdvise(spWebBrowser2, &DIID_DWebBrowserEvents2)))
				ATLASSERT(FALSE);
        }

		// Set host flag to indicate that we handle themes
		CComPtr spHost;
		hRet = QueryHost(IID_IAxWinAmbientDispatch, (void**)&spHost);
		if(SUCCEEDED(hRet))
		{
			const DWORD _DOCHOSTUIFLAG_THEME = 0x40000;
			hRet = spHost->put_DocHostFlags(DOCHOSTUIFLAG_NO3DBORDER | _DOCHOSTUIFLAG_THEME);
			ATLASSERT(SUCCEEDED(hRet));
		}

		return lRet;
	}
	
	LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
	{
		// Disconnect events
		CComPtr spWebBrowser2;
		HRESULT hRet = QueryControl(IID_IWebBrowser2, (void**)&spWebBrowser2);
		if(SUCCEEDED(hRet))
			DispEventUnadvise(spWebBrowser2, &DIID_DWebBrowserEvents2);

		bHandled=FALSE;
		return 1;
	}
};

 

CBrowserView 创建窗口的时候用:

CBrowserView m_view;

m_view.Create(parentHWND, rcDefault, L"http://www.iteye.com", WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_VSCROLL | WS_HSCROLL);

 

分享到:
评论

相关推荐

    MFC的WebBrowser控件 C++与JavaScript之间数据交互传递

    WebBrowser控件允许在MFC应用中嵌入网页浏览功能,而C++与JavaScript之间的数据交互则为这种集成提供了更丰富的可能性。本文将深入探讨如何实现C++和JavaScript之间的数据交换,并通过提供的源代码实例进行详细讲解...

    源代码——MFC的WebBrowser控件 C++与JavaScript之间数据交互传递

    本篇将详细讲解如何利用MFC中的WebBrowser控件实现C++与JavaScript之间的数据交互传递。 首先,WebBrowser控件是MFC提供的一个ActiveX控件,它允许应用程序嵌入Internet Explorer引擎,从而在桌面应用中浏览网页、...

    WebBrowser控件技巧集

    WebBrowser控件是Windows应用程序开发中的一个重要组件,它允许开发者在桌面应用中嵌入Web浏览功能。这个控件集包含了多种使用WebBrowser控件时的技巧和方法,可以帮助开发者更高效、更灵活地利用该控件。下面我们将...

    WebBrowser控件网上资料大全

    2. 执行JavaScript:WebBrowser控件还允许执行JavaScript代码。这在需要与网页上的JavaScript进行交互或执行特定功能时非常有用: ```csharp webBrowser1.Document.InvokeScript("myFunction", new object[] { "参数...

    WebBrowser控件(delphi)

    WebBrowser控件提供了丰富的API接口,可以用来控制网页的加载、导航、交互以及执行JavaScript代码。 以下是一些关于WebBrowser控件的关键知识点: 1. **使用和配置**:在Delphi IDE中,可以从组件面板中拖拽...

    MFC中通过webbrowser控件操作网页。

    在Microsoft Foundation Classes (MFC)框架中,WebBrowser控件是一个强大的工具,它允许开发者在桌面应用程序中嵌入Web浏览器的功能。这个控件是基于Internet Explorer的ActiveX控件,因此,它可以执行大部分IE浏览...

    MFC使用WebBrowser控件调用百度地图API案例

    WebBrowser控件是MFC中一个强大的组件,它允许我们在应用程序内部嵌入Internet Explorer浏览器引擎,从而可以显示网页、执行JavaScript代码,以及与网页进行交互。在本案例中,我们将利用这一特性,通过调用百度地图...

    JavaWeb开发 使用WebBrowser控件打印页面demo

    这个HTML文件可能用于展示如何在客户端通过JavaScript或者其他方式触发WebBrowser控件的打印功能。 总结起来,JavaWeb开发中使用WebBrowser控件打印页面涉及了多层技术栈的交互,包括Java与.NET的互操作、Windows ...

    WebBrowser控件的使用

    5. **脚本错误**:网页中的JavaScript错误也可能导致`WebBrowser`控件崩溃。可以禁用脚本执行,或者捕获并处理`WebBrowser`控件的`DocumentCompleted`事件中的异常。 6. **权限问题**:如果你的应用程序在受限的...

    Winform测试WebBrowser控件对应的IE版本

    在.NET Framework中,WinForm应用程序经常使用WebBrowser控件来集成网页浏览功能。这个控件实际上是基于Internet Explorer的渲染引擎,因此它的行为和兼容性与用户的IE版本密切相关。本篇文章将详细探讨`WinForm测试...

    嵌入WebBrowser控件demo

    WebBrowser控件可以与网页中的JavaScript代码交互,通过实现IDispatch接口,开发者可以捕获和响应JavaScript调用的特定方法或事件,如按钮点击、表单提交等,从而实现C++代码与网页脚本的双向通信。 在提供的文件...

    asp.net 使用WebBrowser控件浏览网页源码

    此外,由于WebBrowser控件实际上是模拟了一个浏览器实例,所以在处理JavaScript动态生成的内容时,可能需要等待JavaScript执行完毕。这可以通过使用`InvokeScript`方法或等待特定的`WebBrowser`事件来实现。 在提供...

    IE WebBrowser控件基本使用

    **IE WebBrowser控件基本使用** 在Windows编程中,IE WebBrowser控件是一个非常重要的组件,它允许开发者在应用程序中嵌入一个Web浏览器的功能。这个控件基于Microsoft Internet Explorer的内核,使得开发者可以...

    一个使用WebBrowser控件获取Web数据的例子

    二是WebBrowser控件可能通过JavaScript或其他方式访问页面上的数据,这些数据可能与Access数据库有关。"下载"可能表示获取网页内容后将其保存到本地文件系统,而"源码"可能涉及查看或解析HTML源代码,以便更好地理解...

    Delphi中webBrowser控件bug.txt

    当使用WebBrowser控件加载包含JavaScript代码的网页时,可能会遇到一个bug:即当JavaScript尝试关闭当前页面时,程序会崩溃或者表现出异常行为。为了解决这个问题,可以通过重写`ApplicationMessage`方法来拦截`WM_...

    WPF中webBrowser控件与脚本交互(调用托管代码)

    总结,WPF的WebBrowser控件结合JavaScript调用托管代码,可以实现丰富的用户交互体验,但在使用过程中需要注意控制安全性和正确管理对象生命周期。通过学习和理解这些知识点,开发者可以构建出更加灵活和强大的混合...

    WEBBrowser 控件 实现浏览器功能

    2. 主要特性:WEBBrowser控件支持导航(加载网页)、前进、后退、停止加载、刷新页面等基本浏览器操作,还可以执行JavaScript代码、打印网页、处理网页事件等高级功能。 二、使用WEBBrowser控件 1. 添加控件:在...

    .NET的WebBrowser控件的的介绍及用法(方法、属性和事件)

    - `ExecuteScript`: 在WebBrowser控件内执行JavaScript代码。 3. **WebBrowser控件的属性** - `Url`: 获取或设置WebBrowser控件当前加载的URL。 - `DocumentTitle`: 获取当前页面的标题。 - `IsBusy`: 指示...

    VC中使用Webbrowser控件相关的安全设置

    4. **脚本禁用**:如果担心JavaScript或其他脚本语言可能造成的安全问题,可以禁用WebBrowser控件的脚本执行。通过`WebBrowser.ObjectForScripting`属性,可以设置一个空对象,从而阻止脚本与客户端代码交互。 5. *...

    WebBrowser执行JS脚本示例

    由于visual studio2005 中WebBrowser控件已经实现了IDocHostUIHandler,所以 只要把应用程序属性类的 "com可见"选上. 再给 this.webBrowser1.ObjectForScripting = this; 赋值就行了 InvokeScript方式: 另外:...

Global site tag (gtag.js) - Google Analytics