URLDownloadToCacheFile或者URLDownloadToFile这两个函数如何在下载时做进度条呀?在网上查了不少资料,是可以的,但是没有详细的东西,希望高手指点,希望不要光给一网址什么的。能给出简单示范的追分!另,我下载了一份urlfile的源码,是可以实现的,但是没看太懂,有没有更简单直观一点的?

解决方案 »

  1.   

    URLDownloadToCacheFile或者URLDownloadToFile这两个函数调用的关键是要实现IBindStatusCallback接口。
    函数内部会调用IBindStatusCallback接口中的函数。
    其中重载IBindStatusCallback::OnProgress就可知道下载的进度,在这个函数内部实现你的进度条更新。一下是一个IBindStatusCallBack的封装例子,可参考一下
    http://www.utblog.com/plog/1/article/1203
      

  2.   

    class CBindCBHttpNego : public IBindStatusCallback, public IHttpNegotiate{
    public:
    DWORD           m_cRef;
    CBindCBHttpNego() : m_cRef(1) {} virtual ~CBindCBHttpNego() {}    // IBindStatusCallback methods.    STDMETHOD(OnStartBinding)(
            /* [in] */ DWORD dwReserved,
            /* [in] */ IBinding __RPC_FAR *pib)
    { return E_NOTIMPL; }    STDMETHOD(GetPriority)(
            /* [out] */ LONG __RPC_FAR *pnPriority)
            { return E_NOTIMPL; }
        STDMETHOD(OnLowResource)(
            /* [in] */ DWORD reserved)
            { return E_NOTIMPL; }   STDMETHOD(OnProgress)(
            /* [in] */ ULONG ulProgress,
            /* [in] */ ULONG ulProgressMax,
            /* [in] */ ULONG ulStatusCode,
            /* [in] */ LPCWSTR wszStatusText)
    { return E_NOTIMPL; }  //在这里实现进度条的更新    STDMETHOD(OnStopBinding)(
            /* [in] */ HRESULT hresult,
            /* [unique][in] */ LPCWSTR szError)
            { return E_NOTIMPL; }    STDMETHOD(GetBindInfo)(
            /* [out] */ DWORD __RPC_FAR *grfBINDF,
            /* [unique][out][in] */ BINDINFO __RPC_FAR *pbindinfo)
            { return E_NOTIMPL; }    STDMETHOD(OnDataAvailable)(
            /* [in] */ DWORD grfBSCF,
            /* [in] */ DWORD dwSize,
            /* [in] */ FORMATETC __RPC_FAR *pformatetc,
            /* [in] */ STGMEDIUM __RPC_FAR *pstgmed)
            { return E_NOTIMPL; }    STDMETHOD(OnObjectAvailable)(
            /* [in] */ REFIID riid,
            /* [iid_is][in] */ IUnknown __RPC_FAR *punk)
            { return E_NOTIMPL; } // IHttpNegotiate methods STDMETHODIMP BeginningTransaction(/* [in] */ LPCWSTR szURL,
    /* [unique][in] */ LPCWSTR szHeaders,
    /* [in] */ DWORD dwReserved,
    /* [out] */ LPWSTR __RPC_FAR *pszAdditionalHeaders);            STDMETHODIMP OnResponse(/* [in] */ DWORD dwResponseCode,
            /* [unique][in] */ LPCWSTR szResponseHeaders,
            /* [unique][in] */ LPCWSTR szRequestHeaders,
            /* [out] */ LPWSTR __RPC_FAR *pszAdditionalRequestHeaders)
    { return E_NOTIMPL; }    // IUnknown methods. // @Note that IE never calls any of these methods, since the caller owns the IBindStatusCallback interface
        STDMETHOD_(ULONG,AddRef)() { return m_cRef++; }
        STDMETHOD_(ULONG,Release)() { if (--m_cRef == 0) { delete this; return 0; } return m_cRef; }
        STDMETHOD(QueryInterface)(
        /* [in] */ REFIID riid,
        /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject)
    {
    *ppvObject = NULL;
    if (riid==IID_IUnknown || riid==IID_IBindStatusCallback)
    {
    *ppvObject = (IBindStatusCallback*)this;
    AddRef();
    return S_OK;
    }
    else if (riid==IID_IHttpNegotiate)
    {
    *ppvObject = (IHttpNegotiate*)this;
    AddRef();
    return S_OK;
    }
    else {
    return E_NOINTERFACE;
    }
    }
    };
      

  3.   

    是不是要自己写一个类来继承IBindStatusCallback,
    然后重新实现CBSCallbackImpl的OnProgress方法呢?
      

  4.   

    为什么我写的类在实例化时就出错?error LNK2019: 无法解析的外部符号 "public: __thiscall CBSCallbackImpl::CBSCallbackImpl(void)" (??0CBSCallbackImpl@@QAE@XZ),该符号在函数 "public: static unsigned int __cdecl CXUpdateDlg::Download(void *)" (?Download@CXUpdateDlg@@SAIPAX@Z) 中被引用