在自已的程序中加入了WEB控件,调用Navigate2后用什么函数判断网页下载完成,高手快来呀!!!!!

解决方案 »

  1.   

    handle DWebBrowserEvent2::DocumentComplete
    see also
    http://blog.csdn.net/jiangsheng/archive/2003/11/09/3790.aspx
      

  2.   

    How To Determine When a Page Is Done Loading in WebBrowser Controlhttp://support.microsoft.com/kb/180366/EN-US/
      

  3.   

    看不明白:请问高手
    void myObject::DocumentComplete(LPDISPATCH pDisp, VARIANT* URL)
    {
        HRESULT hr;
        IUnknown* pUnkBrowser = NULL;
        IUnknown* pUnkDisp = NULL;
        IStream* pStream = NULL;
        HGLOBAL hHTMLText;
        static TCHAR szHTMLText[] = "<html><h1>流测试</h1><p>本HTML内容已经从流中加载。</html>";
        // 这个 DocumentComplete 事件是否是顶层框架窗口的?
        // 检查 COM 标识: 比较IUnknown 接口指针.
        hr = m_pBrowser->QueryInterface( IID_IUnknown,  (void**)&pUnkBrowser );
        if ( SUCCEEDED(hr) )
        {
            hr = pDisp->QueryInterface( IID_IUnknown,  (void**)&pUnkDisp );
            if ( SUCCEEDED(hr) )
            {
                if ( pUnkBrowser == pUnkDisp )
                {   // 这是顶层框架窗口的DocumentComplete 事件 —— 页面 载入完成!
                    // 建立一个包含HTML内容的流
                    // 另外, 这个流可以是被传递过来的(而不是被创建的)
       
                    size_t = cchLength;
                    //  TODO: 安全地判断 szHTMLText的长度,单位是TCHAR.
                    hHTMLText = GlobalAlloc( GPTR, cchLength+1 );
        
                    if ( hHTMLText )
                    {
                        size_t cchMax = 256;
                        StringCchCopy((TCHAR*)hHTMLText, cchMax + 1, szHTMLText);
                        //  TODO: 在这里加入错误处理代码。
                        hr = CreateStreamOnHGlobal( hHTMLText, TRUE, &pStream );
                        if ( SUCCEEDED(hr) )
                        {
                           // 调用辅助函数让网络浏览器加载流。
                           LoadWebBrowserFromStream( m_pBrowser, pStream  );
                           pStream->Release();
                        }
                        GlobalFree( hHTMLText );
                    }
                }
                pUnkDisp->Release();
            }
            pUnkBrowser->Release();
        }
    }
    在这个函数中没有引用DWebBrowserEvents2::DocumentComplete 事件呀而它只是作了一个相同的函数我的程序中需要如下调用
    HRESULT hr2;
        IUnknown* pUnkBrowser = NULL;
        IUnknown* pUnkDisp = NULL;
    LPDISPATCH pDisp;
    DWebBrowserEvents2::DocumentComplete(pDisp,_bstr_t("http://....."));
    hr2 = m_web.QueryInterface( IID_IUnknown,  (void**)&pUnkBrowser );
        if ( SUCCEEDED(hr2) )
        {
            hr2 = pDisp->QueryInterface( IID_IUnknown,  (void**)&pUnkDisp );
            if ( SUCCEEDED(hr2) )
            {
                if ( pUnkBrowser == pUnkDisp )
    { ........................
                                }
             }
        }
    可是不行我用的是WEB控件(也就是CWebBrowser2类)高手请问用CWebBrowser2有没有判断网页下载完全的函数,应该怎么用?
      

  4.   

    把CHTMLView源代码里面的Event处理代码拿出来就可以
      

  5.   

    现在还有一个问题是:我在同一个函数内用m_web.Navigate("....", &vtEmpty, &vtEmpty, &vtEmpty, &vtEmpty);网页后用DocumentComplete判断网页是否下载完成可是总是不成功是否需要进行延时判断因该怎么做呀!!!!
      

  6.   

    GZ我也被这个问题困扰了一段时间。目前,我用的办法是在 readyState 变为 interactive 后,延时一段时间,然后就判断为载入完成。
      

  7.   

    你可以在函数中再启动一个消息循环,不过不推荐这么做。推荐的方法还是把代码放在DocumentComplete的处理里面。
      

  8.   

    可是,某些情况下DocumentComplete无法触发,状态栏显示正在下载网页,也没法手动停止。
      

  9.   

    那你可以在beforenavigate2事件中设置一个timer,在一段时间内没有documentcomplete就认为浏览失败。
      

  10.   

    读到数据没有时,
    while(true)
    {}
      

  11.   

    在beforenavigate2事件中设置一个timer,在一段时间内没有documentcomplete就认为浏览失败。
    这是最好的解决方法:)
      

  12.   

    还有一个方法是在documentcomplete的时候判断document的title是不是page not found或者找不到服务器之类,但是服务器可以自定义错误页面的,这个方法不太保险。
      

  13.   

    谢谢 jiangsheng(蒋晟.MSMVP2004Jan)  的帮助问题已解决