none
通过IWebBrowser2接口多次显示HTML时,速度会下降?(基于IE6) RRS feed

  • 问题

  • 总的来说,这方面的问题已经在MSDN上发了多次……我本人水平不高,大家给的很多好的方案都看不明白或者不知道如何实现……整的我很无奈……前面的问题都凑合着混过去了,现在又来了……

    代码如下:
    建立窗体
        m_hWeb = CreateWindowEx(
            WS_EX_TOOLWINDOW,
            "AtlAxWin90",
            "Shell.Explorer.2",
            WS_POPUP | WS_VISIBLE ,
            m_nLeft,
            m_nTop,
            m_nWidth,
            m_nHeight,
            NULL,
            NULL,
            NULL,
            NULL
            );

    获取IWebBrowser2
        CComQIPtr<IWebBrowser2> m_pIE;
        lAtlRet = AtlAxGetControl(m_hWeb, &pDef);
        if (lAtlRet != S_OK)
        {
            return FALSE;
        }
       
        m_pIE = pDef;
        if (m_pIE == NULL)
        {
            return FALSE;
        }
     
    实现 IDispatch接口
    interface IWebEvent : public IDispatch
    {
    public:
        HANDLE m_hEventHandle;
        IDispatch* m_IDispatch;
        void setIDispatch(IDispatch* IDispatch)
        {
            m_IDispatch = IDispatch;
        }
        void setHandle(HANDLE handle)
        {
            m_hEventHandle = handle;
        }
     
        //IDispatch
        HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void ** ppvObject)
        {
            if(IsEqualIID(iid, IID_IUnknown)||
                IsEqualIID(iid, IID_IDispatch)||
                IsEqualIID(iid, DIID_DWebBrowserEvents2))
            {
                *ppvObject = this;
            }
            else
            {
                *ppvObject = NULL;
                return E_NOINTERFACE;
            }
            return S_OK;
        }
     
        ULONG STDMETHODCALLTYPE AddRef(void)
        {
            return 1;
        }
        ULONG STDMETHODCALLTYPE Release(void)
        {
            return 0;
        }
        HRESULT STDMETHODCALLTYPE GetTypeInfo(unsigned int iTInfo, LCID lcid, ITypeInfo FAR* FAR* ppTInfo)
        {
            if (ppTInfo == NULL)
            {
                return E_INVALIDARG;
            }
            *ppTInfo = NULL;
            if(iTInfo != 0)
            {
                return DISP_E_BADINDEX;
            }
            return S_OK;
        }
        HRESULT STDMETHODCALLTYPE GetTypeInfoCount(unsigned int FAR* pctinfo)
        {
            return E_NOTIMPL;
        }
        HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, OLECHAR FAR* FAR* rgszNames, unsigned int cNames, LCID lcid, DISPID FAR* rgDispId)
        {
            return E_NOTIMPL;
        }
        HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS FAR* pDispParams, VARIANT FAR* pVarResult, EXCEPINFO FAR* pExcepInfo, unsigned int FAR* puArgErr)
        {
            switch(dispIdMember)
            {
            case DISPID_DOCUMENTCOMPLETE://DocumentComplete
                char buff[256];
                memset(buff,0,256);
                wcstombs(buff,pDispParams->rgvarg[0].pvarVal->bstrVal,256);
                if (m_IDispatch == (IDispatch*)pDispParams->rgvarg[1].ppdispVal)
                {
                    SetEvent(m_hEventHandle);
                }
                break;
            default:
                break;
            }
            return S_OK;
        }
    };
    设置链接点
        m_hDocComplete = CreateEvent(NULL, FALSE, FALSE, NULL);
        m_cWebEvent = new IWebEvent();
        m_cWebEvent->QueryInterface(IID_IDispatch, (void **)&m_cWebEvent);
        m_cWebEvent->setHandle(m_hDocComplete);
        IConnectionPointContainer *spCPC;
        hRet = m_pIE->QueryInterface(IID_IConnectionPointContainer,(void**)&spCPC);
        if(FAILED(hRet))
        {
            MessageBox(NULL, "m_pIE->QueryInterface", "m_pIE->QueryInterface", NULL);
        }
     
        IConnectionPoint *spCP;
        hRet = spCPC->FindConnectionPoint(DIID_DWebBrowserEvents2,&spCP);
        if(FAILED(hRet))
        {
            MessageBox(NULL, "spCPC->FindConnectionPoint", "spCPC->FindConnectionPoint", NULL);
        }
        DWORD cookie;
        hRet = spCP->Advise(m_cWebEvent, &cookie);
        if(FAILED(hRet))
        {
            MessageBox(NULL, "spCP->Advise", "spCP->Advise", NULL);
        }
        m_pIE->QueryInterface(IID_IDispatch,(void**)&lpWBDisp);
        m_cWebEvent->setIDispatch(lpWBDisp);
    等待 DOCUMENTCOMPLETE事件中设置的EVENT
            CComVariant vUrl(chHtmlFileNameBuffer);
            CComVariant vEmpty;
            hRet = m_pIE->put_Visible(VARIANT_TRUE);
            if (hRet != S_OK)
            {
                return FALSE;
            }
     
            hRet = m_pIE->Navigate2(&vUrl, &vEmpty, &vEmpty, &vEmpty, &vEmpty);
            if (hRet != S_OK)
            {
                return FALSE;
            }
     
            if (g_hTopMost == m_hWeb)
            {
                return TRUE;
            }
     
            WaitForSingleObject(m_hDocComplete, INFINITE);

    问题现象:
    在这个建立的IWebBrowser2上重复显示同一个HTML面(不是刷新,就只是重复的去执行
    Navigate2那段程序 )。速度会越来越慢,比如IE6的话,一个CSS特效很多的HTML在一开始大概需要1秒加载完毕,但几百次以后会变成10秒多。这个时候如果换个简单页面显示一次,然后再加载之前的页面,速度又恢复了。如果把CSS干掉,速度确实会上升,但这个方案肯定不会通过的……
    换IE7和IE8之后貌似没有问题。但是由于指定的就是IE6,所以很纠结……
    至于为什么会连续几百次显示同一个页面,我只能说最终用户很SB,有这种操作的需求……
    各位高人啊,有什么可以改动或者优化的地方没有?要给整崩溃了……
    2010年3月11日 1:19

答案

  • IE6 的兼容性的确不是很好,加上目前越来越多的代码和技术不再支持IE6. 可能会出现较多的问题。还是比较建议你的客户把浏览器升级到IE7 以上,或许这是一个最好的解决方案。如果继续使用IE6 难以确保将来是否还会出现类似的问题。
    This posting is provided "AS IS" with no warranties, and confers no rights. Microsoft Online Community Support
    2010年3月18日 11:54
    版主