想给IE增加一个保存网页所有图片的功能(IE只能一张一张的保存,要不就保存整个网页),但是不知道怎么实现,即使得到了图片元素的接口,但是也没发现有实现这个的,请教高手怎么实现?

解决方案 »

  1.   

    void CMyHtmlView::SaveImages( IHTMLDocument2* pDoc, CString sPath)
    {
        USES_CONVERSION;    // Получаем коллекцию тэгов <IMG>
        CComQIPtr<IHTMLElementCollection, &IID_IHTMLElementCollection> pImages;
        pDoc->get_images( &pImages);    long nImages;
        pImages->get_length( &nImages);
        for (int i=0; i<nImages; i++)
        {
            CComVariant v1( i), v2;    
            CComQIPtr<IDispatch, &IID_IDispatch> pDisp;
            CComQIPtr<IHTMLImgElement, &IID_IHTMLImgElement> pImg;
            pImages->item( v1, v2, &pDisp);
            pImg = pDisp;
            
            CComBSTR bstr; 
            pImg->get_src( &bstr);        CString fname;
            fname.Format( "%simg_%d.gif", sPath, i);
           if( SUCCEEDED( URLDownloadToFile( 0, W2A( bstr), fname, 0, 0) ) )
            {
                bstr = fname;
                pImg->put_src( bstr.Copy());
            }
        }    
    }
      

  2.   

    IHTMLDocument2::elementFromPoint MethodReturns the element for the specified x and y coordinates. SyntaxHRESULT elementFromPoint(
        long x,
        long y,
        IHTMLElement **elementHit
    );或者可以考虑BHO
      

  3.   

    HRESULT CApp::GetAllImgs()
    {
    HRESULT hr;
    if ((!m_pMSHTML)||(READYSTATE_COMPLETE != m_lReadyState))
    {
    ODS("Shouldn't get here 'til MSHTML changes readyState to READYSTATE_COMPLETE\n");
    //DebugBreak();
    return E_UNEXPECTED;
    }
    IHTMLElementCollection* p_imgColl = NULL;
    if (SUCCEEDED(hr = m_pMSHTML->get_all( &p_imgColl )))
    {
    long cElems=0;
    // retrieve the count of elements in the collection
    if (SUCCEEDED(hr = p_imgColl->get_length( &cElems )))
    {
    for ( int i=0; i<cElems; i++ )
    {
    VARIANT vIndex;
    vIndex.vt = VT_UINT;
    vIndex.lVal = i;
    VARIANT var2 = { 0 };
    LPDISPATCH pDisp;
    if (SUCCEEDED(hr = p_imgColl->item( vIndex, var2, &pDisp )))
    {
    bool b_print_tag=true;
    if(b_print_tag)
    {
    IHTMLImgElement* pImage = NULL; 
    if (SUCCEEDED(hr = pDisp->QueryInterface( IID_IHTMLImgElement, (LPVOID*)&pImage )))
    {
    BSTR bstr;
    pImage->get_src(&bstr);
    pImage->Release();
    b_print_tag=false;
    if (bstr)
    {
    SaveImg(bstr);
    SysFreeString(bstr);
    }
    }
    }
    pDisp->Release();
    } // item
    } // for
    } // get_length
    p_imgColl->Release();
    }
    IHTMLElementCollection* pColl = NULL; if (SUCCEEDED(hr = m_pMSHTML->get_all( &pColl )))
    {
    long cElems=0;
    // retrieve the count of elements in the collection
    if (SUCCEEDED(hr = pColl->get_length( &cElems )))
    {
    for ( int i=0; i<cElems; i++ )
    {
    VARIANT vIndex;
    vIndex.vt = VT_UINT;
    vIndex.lVal = i;
    VARIANT var2 = { 0 };
    LPDISPATCH pDisp;
    if (SUCCEEDED(hr = pColl->item( vIndex, var2, &pDisp )))
    {
    IHTMLInputElement* pInput=NULL; 
    if (SUCCEEDED(hr = pDisp->QueryInterface( IID_IHTMLInputElement, (LPVOID*)&pInput )))
    {
    BSTR bstr;
    pInput->get_src(&bstr);
    pInput->Release();
    if (bstr&&SysStringLen(bstr)>4)
    {
    SaveImg(bstr);
    SysFreeString(bstr);
    }
    }
    pDisp->Release();
    } // item
    } // for
    } // get_length
    pColl->Release();
    } // get_all
    // We're done so post ourselves a quit to terminate the message pump.
    PostQuitMessage(0);
    return hr;
    }
      

  4.   

    etre,用URLDownloadToFile是不是要重新从Internet上下载啊,可是IE已经下载到缓存上了,有没有办法从缓存中直接保存下来?
      

  5.   

    kinzai的代码只有获得img的URL的,没有保存img的具体的代码啊。 
    if (bstr)
    {SaveImg(bstr);
    SysFreeString(bstr);
    }
    SaveImg()具体是怎么实现的?也是用URLDownloadToFile函数吗?
      

  6.   

    URLDownloadToFile在这个时候是从缓存中直接保存下来