我继承了CHtmlView ,同时使用了在派生中调用了IHTMLDocument2接口。我现在想使在页面脚本有错误的情况,不弹出对话框,这样的话,别人就不会影响客户的使用。当然更重要的事,客户认为弹框这是我造成的

解决方案 »

  1.   

    #include <exdispid.h>
    #include <mshtmcid.h> // CMDSETID_Forms3 definition
    #include <mshtmhst.h> // IDM_menu item definitions
    #include <mshtml.h>
    #pragma warning(disable:4100)
    class CMyHtmlControlSite : public  COleControlSite 
    {  
    public:  
    CMyHtmlControlSite(COleControlContainer *pCntr);
    ~CMyHtmlControlSite(void);  
    CStartPageHtmlCtrl *m_pViw;
    CHtmlView* GetView() const;
    protected:   BEGIN_INTERFACE_PART(DocHostUIHandler, IDocHostUIHandler) STDMETHOD(GetExternal)(LPDISPATCH*);
    STDMETHOD(GetHostInfo)(DOCHOSTUIINFO*); STDMETHOD(ShowContextMenu)(DWORD, LPPOINT, LPUNKNOWN, LPDISPATCH);

    STDMETHOD(ShowUI)(DWORD, LPOLEINPLACEACTIVEOBJECT,LPOLECOMMANDTARGET, LPOLEINPLACEFRAME, LPOLEINPLACEUIWINDOW);
    STDMETHOD(HideUI)(void);
    STDMETHOD(UpdateUI)(void);
    STDMETHOD(EnableModeless)(BOOL);
    STDMETHOD(OnDocWindowActivate)(BOOL);
    STDMETHOD(OnFrameWindowActivate)(BOOL);
    STDMETHOD(ResizeBorder)(LPCRECT, LPOLEINPLACEUIWINDOW, BOOL);
    STDMETHOD(TranslateAccelerator)(LPMSG, const GUID*, DWORD);
    STDMETHOD(GetOptionKeyPath)(OLECHAR **, DWORD);
    STDMETHOD(GetDropTarget)(LPDROPTARGET, LPDROPTARGET*); STDMETHOD(TranslateUrl)(DWORD, OLECHAR*, OLECHAR **);
    STDMETHOD(FilterDataObject)(LPDATAOBJECT , LPDATAOBJECT*); END_INTERFACE_PART(DocHostUIHandler)
    BEGIN_INTERFACE_PART(OleCommandTarget, IOleCommandTarget)    
    STDMETHOD(QueryStatus)(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText);    
    STDMETHOD(Exec)(const GUID* pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG* pvaIn, VARIANTARG* pvaOut);  
    END_INTERFACE_PART(OleCommandTarget)    DECLARE_INTERFACE_MAP()   };  BEGIN_INTERFACE_MAP(CMyHtmlControlSite, COleControlSite)    

    INTERFACE_PART(CMyHtmlControlSite, IID_IDocHostUIHandler, DocHostUIHandler)
    INTERFACE_PART(CMyHtmlControlSite, IID_IOleCommandTarget, OleCommandTarget)  
    END_INTERFACE_MAP()    
      
     CMyHtmlControlSite::CMyHtmlControlSite(COleControlContainer* pContainer): COleControlSite(pContainer)
    {
    }  
    CMyHtmlControlSite::~CMyHtmlControlSite(void)  
    {  
    }  
      
    HRESULT CMyHtmlControlSite::XOleCommandTarget::Exec    
    (const GUID* pguidCmdGroup, DWORD nCmdID,    
     DWORD nCmdexecopt, VARIANTARG* pvaIn, VARIANTARG* pvaOut )    
    {    
        HRESULT hr = OLECMDERR_E_NOTSUPPORTED;    
        //return S_OK;     
        if (pguidCmdGroup && IsEqualGUID(*pguidCmdGroup, CGID_DocHostCommandHandler))    
        {    
      
            switch (nCmdID)     
            {    
      
            case OLECMDID_SHOWSCRIPTERROR:    
                {    
                    IHTMLDocument2*             pDoc = NULL;    
                    IHTMLWindow2*               pWindow = NULL;    
                    IHTMLEventObj*              pEventObj = NULL;    
                    BSTR                        rgwszNames[5] =     
                    {     
                       /* SysAllocString(L"errLine"),    
                        SysAllocString(L"errCharacter"),    
                        SysAllocString(L"errCode"),    
                        SysAllocString(L"errMsg"),    
                        SysAllocString(L"errUrl")    */ SysAllocString(L"errorLine"), 
    SysAllocString(L"errorCharacter"), 
    SysAllocString(L"errorCode"), 
    SysAllocString(L"errorMessage"), 
    SysAllocString(L"errorUrl") 
                    };    
                    DISPID                      rgDispIDs[5];    
                    VARIANT                     rgvaEventInfo[5];    
                    DISPPARAMS                  params;    
                    BOOL                        fContinueRunningScripts = false;  //修改此处为false禁止脚本错误提示   
      
                    params.cArgs = 0;    
                    params.cNamedArgs = 0;    
                      
                    hr = pvaIn->punkVal->QueryInterface(IID_IHTMLDocument2, (void **) &pDoc);        
                       
                    hr = pDoc->get_parentWindow(&pWindow);    
                    pDoc->Release();    
                      
                    hr = pWindow->get_event(&pEventObj);    
                      
                    for (int i = 0; i < 5; i++)     
                    {      
                          
                        hr = pEventObj->GetIDsOfNames(IID_NULL, &rgwszNames[i], 1,     
                            LOCALE_SYSTEM_DEFAULT, &rgDispIDs[i]);    
                      
                        hr = pEventObj->Invoke(
    rgDispIDs[i], 
    IID_NULL,    
    LOCALE_SYSTEM_DEFAULT,    
    DISPATCH_PROPERTYGET,
    &params,
    &rgvaEventInfo[i],    
    NULL,
    NULL
                      );    
                        //可以在此记录错误信息                    
    //必须使用SysFreeString来释放SysAllocString分配的内存,
    //SysAllocString在分配的内存中记录了字符的长度   
                        SysFreeString(rgwszNames[i]);    
                    }    
      
                    // At this point, you would normally alert the user with      
                    // the information about the error, which is now contained     
                    // in rgvaEventInfo[]. Or, you could just exit silently.     
      
                    (*pvaOut).vt = VT_BOOL;    
                    if (fContinueRunningScripts)    
                    {    
                        // 在页面中继续执行脚本    
                        (*pvaOut).boolVal = VARIANT_TRUE;    
                    }    
                    else   
                    {    
                        // 停止在页面中执行脚本     
                        (*pvaOut).boolVal = VARIANT_FALSE;       
                    }     
                    break;    
                }    
            default:    
                hr =OLECMDERR_E_NOTSUPPORTED;   
                break;    
            }    
        }    
        else   
        {    
            hr = OLECMDERR_E_UNKNOWNGROUP;  
        }    
        return (hr);    
    }    
      ULONG FAR EXPORT CMyHtmlControlSite::XOleCommandTarget::AddRef()     
    {     
        METHOD_PROLOGUE(CMyHtmlControlSite, OleCommandTarget)     
            return pThis->ExternalAddRef();     
    }     
      
      
    ULONG FAR EXPORT CMyHtmlControlSite::XOleCommandTarget::Release()     
    {     
        METHOD_PROLOGUE(CMyHtmlControlSite, OleCommandTarget)     
            return pThis->ExternalRelease();     
    }     
      
    HRESULT FAR EXPORT CMyHtmlControlSite::XOleCommandTarget::QueryInterface(REFIID riid, void **ppvObj)     
    {     
        METHOD_PROLOGUE(CMyHtmlControlSite, OleCommandTarget)     
            HRESULT hr = (HRESULT)pThis->ExternalQueryInterface(&riid, ppvObj);     
        return hr;     
    }    
      
    STDMETHODIMP CMyHtmlControlSite::XOleCommandTarget::QueryStatus(     
         const GUID __RPC_FAR *pguidCmdGroup,     
         ULONG cCmds,     
         OLECMD __RPC_FAR prgCmds[ ],     
         OLECMDTEXT __RPC_FAR *pCmdText     
        )     
    {     
        METHOD_PROLOGUE(CMyHtmlControlSite, OleCommandTarget)     
            return OLECMDERR_E_NOTSUPPORTED;     
    }   STDMETHODIMP CMyHtmlControlSite::XDocHostUIHandler::GetHostInfo(
    DOCHOSTUIINFO *pInfo)
    {
    METHOD_PROLOGUE_EX(CMyHtmlControlSite, DocHostUIHandler) CHtmlView* pView = pThis->GetView();
    ASSERT_VALID(pView);
    if (pView == NULL)
    {
    return E_FAIL;
    }
    pInfo->dwDoubleClick = DOCHOSTUIDBLCLK_DEFAULT;
    return pView->OnGetHostInfo(pInfo);
    }STDMETHODIMP_(ULONG) CMyHtmlControlSite::XDocHostUIHandler::AddRef()
    {
    METHOD_PROLOGUE_EX_(CMyHtmlControlSite, DocHostUIHandler)
    return pThis->ExternalAddRef();
    }STDMETHODIMP_(ULONG) CMyHtmlControlSite::XDocHostUIHandler::Release()
    {
    METHOD_PROLOGUE_EX_(CMyHtmlControlSite, DocHostUIHandler)
    return pThis->ExternalRelease();
    }STDMETHODIMP CMyHtmlControlSite::XDocHostUIHandler::QueryInterface(
    REFIID iid, LPVOID far* ppvObj)     
    {
    METHOD_PROLOGUE_EX_(CMyHtmlControlSite, DocHostUIHandler)
    return pThis->ExternalQueryInterface(&iid, ppvObj);
    }
    CHtmlView* CMyHtmlControlSite::GetView() const
    {
    return STATIC_DOWNCAST(CHtmlView, m_pCtrlCont->m_pWnd);
    }STDMETHODIMP CMyHtmlControlSite::XDocHostUIHandler::GetExternal(LPDISPATCH *lppDispatch)
    {
    METHOD_PROLOGUE_EX_(CMyHtmlControlSite, DocHostUIHandler) CHtmlView* pView = pThis->GetView();
    ASSERT_VALID(pView);
    if (pView == NULL)
    {
    return E_FAIL;
    }
    return pView->OnGetExternal(lppDispatch);
    }STDMETHODIMP CMyHtmlControlSite::XDocHostUIHandler::ShowContextMenu(
    DWORD dwID, LPPOINT ppt, LPUNKNOWN pcmdtReserved, LPDISPATCH pdispReserved)
    {
    METHOD_PROLOGUE_EX_(CMyHtmlControlSite, DocHostUIHandler) CHtmlView* pView = pThis->GetView();
    ASSERT_VALID(pView);
    if (pView == NULL)
    {
    return E_FAIL;
    }
    return pView->OnShowContextMenu(dwID, ppt, pcmdtReserved, pdispReserved);
    }
    STDMETHODIMP CMyHtmlControlSite::XDocHostUIHandler::ShowUI(
    DWORD dwID, LPOLEINPLACEACTIVEOBJECT pActiveObject,
    LPOLECOMMANDTARGET pCommandTarget, LPOLEINPLACEFRAME pFrame,
    LPOLEINPLACEUIWINDOW pDoc)
    {
    METHOD_PROLOGUE_EX_(CMyHtmlControlSite, DocHostUIHandler) CHtmlView* pView = pThis->GetView();
    ASSERT_VALID(pView);
    if (pView == NULL)
    {
    return E_FAIL;
    }
    return pView->OnShowUI(dwID, pActiveObject, pCommandTarget, pFrame, pDoc);
    }STDMETHODIMP CMyHtmlControlSite::XDocHostUIHandler::HideUI(void)
    {
    METHOD_PROLOGUE_EX_(CMyHtmlControlSite, DocHostUIHandler) CHtmlView* pView = pThis->GetView();
    ASSERT_VALID(pView);
    if (pView == NULL)
    {
    return E_FAIL;
    }
    return pView->OnHideUI();
    }
      

  2.   

    STDMETHODIMP CMyHtmlControlSite::XDocHostUIHandler::UpdateUI(void)
    {
    METHOD_PROLOGUE_EX_(CMyHtmlControlSite, DocHostUIHandler) CHtmlView* pView = pThis->GetView();
    ASSERT_VALID(pView);
    if (pView == NULL)
    {
    return E_FAIL;
    }
    return pView->OnUpdateUI();
    }STDMETHODIMP CMyHtmlControlSite::XDocHostUIHandler::EnableModeless(BOOL fEnable)
    {
    METHOD_PROLOGUE_EX_(CMyHtmlControlSite, DocHostUIHandler)
    CHtmlView* pView = pThis->GetView();
    ASSERT_VALID(pView);
    if (pView == NULL)
    {
    return E_FAIL;
    }
    return pView->OnEnableModeless(fEnable);
    }STDMETHODIMP CMyHtmlControlSite::XDocHostUIHandler::OnDocWindowActivate(BOOL fActivate)
    {
    METHOD_PROLOGUE_EX_(CMyHtmlControlSite, DocHostUIHandler)
    CHtmlView* pView = pThis->GetView();
    ASSERT_VALID(pView);
    if (pView == NULL)
    {
    return E_FAIL;
    }
    return pView->OnDocWindowActivate(fActivate);
    }
    STDMETHODIMP CMyHtmlControlSite::XDocHostUIHandler::OnFrameWindowActivate(
    BOOL fActivate)
    {
    METHOD_PROLOGUE_EX_(CMyHtmlControlSite, DocHostUIHandler)
    CHtmlView* pView = pThis->GetView();
    ASSERT_VALID(pView);
    if (pView == NULL)
    {
    return E_FAIL;
    }
    return pView->OnFrameWindowActivate(fActivate);
    }STDMETHODIMP CMyHtmlControlSite::XDocHostUIHandler::ResizeBorder(
    LPCRECT prcBorder, LPOLEINPLACEUIWINDOW pUIWindow, BOOL fFrameWindow)
    {
    METHOD_PROLOGUE_EX_(CMyHtmlControlSite, DocHostUIHandler)
    CHtmlView* pView = pThis->GetView();
    ASSERT_VALID(pView);
    if (pView == NULL)
    {
    return E_FAIL;
    }
    return pView->OnResizeBorder(prcBorder, pUIWindow, fFrameWindow);
    }STDMETHODIMP CMyHtmlControlSite::XDocHostUIHandler::TranslateAccelerator(
    LPMSG lpMsg, const GUID* pguidCmdGroup, DWORD nCmdID)
    {
    METHOD_PROLOGUE_EX_(CMyHtmlControlSite, DocHostUIHandler)
    CHtmlView* pView = pThis->GetView();
    ASSERT_VALID(pView);
    if (pView == NULL)
    {
    return E_FAIL;
    }
    return pView->OnTranslateAccelerator(lpMsg, pguidCmdGroup, nCmdID);
    }STDMETHODIMP CMyHtmlControlSite::XDocHostUIHandler::GetOptionKeyPath(
    LPOLESTR* pchKey, DWORD dwReserved)
    {
    METHOD_PROLOGUE_EX_(CMyHtmlControlSite, DocHostUIHandler)
    CHtmlView* pView = pThis->GetView();
    ASSERT_VALID(pView);
    if (pView == NULL)
    {
    return E_FAIL;
    }
    return pView->OnGetOptionKeyPath(pchKey, dwReserved);
    }STDMETHODIMP CMyHtmlControlSite::XDocHostUIHandler::GetDropTarget(
    LPDROPTARGET pDropTarget, LPDROPTARGET* ppDropTarget)
    {
    METHOD_PROLOGUE_EX_(CMyHtmlControlSite, DocHostUIHandler)
    CHtmlView* pView = pThis->GetView();
    ASSERT_VALID(pView);
    if (pView == NULL)
    {
    return E_FAIL;
    }
    return pView->OnGetDropTarget(pDropTarget, ppDropTarget);
    }STDMETHODIMP CMyHtmlControlSite::XDocHostUIHandler::TranslateUrl(
    DWORD dwTranslate, OLECHAR* pchURLIn, OLECHAR** ppchURLOut)
    {
    METHOD_PROLOGUE_EX_(CMyHtmlControlSite, DocHostUIHandler)
    CHtmlView* pView = pThis->GetView();
    ASSERT_VALID(pView);
    if (pView == NULL)
    {
    return E_FAIL;
    }
    return pView->OnTranslateUrl(dwTranslate, pchURLIn, ppchURLOut);
    }STDMETHODIMP CMyHtmlControlSite::XDocHostUIHandler::FilterDataObject(
    LPDATAOBJECT pDataObject, LPDATAOBJECT* ppDataObject)
    {
    METHOD_PROLOGUE_EX_(CMyHtmlControlSite, DocHostUIHandler)
    CHtmlView* pView = pThis->GetView();
    ASSERT_VALID(pView);
    if (pView == NULL)
    {
    return E_FAIL;
    }
    return pView->OnFilterDataObject(pDataObject, ppDataObject);
    }啊。来个人回复一下,我好结贴。
    在这里感谢一下给我信息和方向的博客作者
    http://www.cnblogs.com/thinkingfor/archive/2010/11/10/1873689.html如果你不是用的CHtmlview而是CDHtmlDialog 采用他在做法。
    累死了。又熬夜了。