WebBrowser中禁用脚本错误对话框

来源:互联网 发布:anaconda ubuntu 16.04 编辑:程序博客网 时间:2024/05/18 15:55
#include <mshtmhst.h>#include <exdisp.h>#include <atlcomcli.h>#include <mshtml.h>class CDisableScriptErrHelper    : 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 )        {            CComQIPtr<IHTMLDocument2, &IID_IHTMLDocument2> spHTML( spDisp );            if ( spHTML )            {                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;                    }                }                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 )        {            ( *pvaOut ).vt = VT_BOOL;            ( *pvaOut ).boolVal = VARIANT_TRUE;            return S_OK;        }        return m_spDefaultOleCommandTarget->Exec( pguidCmdGroup, nCmdID, nCmdExecOpt, pvaIn, pvaOut );    }    private:    CComQIPtr<IDocHostUIHandler, &IID_IDocHostUIHandler> m_spDefaultDocHostUIHandler;    CComQIPtr<IOleCommandTarget, &IID_IOleCommandTarget> m_spDefaultOleCommandTarget;    LONG m_cRef;};


在OnDocumentComplete 和OnBeforeNavigate事件中加入SetHandle即可

原创粉丝点击