下面进行了简单的封装.使用时实现一个
LPFN_NET_DL_PROGRESS类型的回调函数后调用URLDownloadProgress方法即可.
LPFN_NET_DL_PROGRESS函数得到当前下载进度.
Parameters:
[ulState] Unsigned long integer that receives additional information regarding the progress of the bind operation. This can be any of the
BINDSTATUS values.
- // interface for the downloadprogress class.
- #if !defined(URLDOWNLOADPROGRESS_H)
- #define URLDOWNLOADPROGRESS_H
- #include <Urlmon.h>
- #pragma comment(lib, "Urlmon.lib")
- typedef void (*LPFN_NET_DL_PROGRESS)(
- unsigned long ulProgress,
- unsigned long ulProgressMax,
- unsigned long ulState);
- HRESULT URLDownloadProgress(
- const char* lpszURL,
- const char* lpszFile,
- LPFN_NET_DL_PROGRESS lpcallback);
- #endif // !defined(URLDOWNLOADPROGRESS_H)
- // implementation of the downloadprogress class.
- #include "stdafx.h"
- #include "urldownloadprogress.h"
- //
- // CBindCBHttpCallback
- //
- class CBindCBHttpCallback : public IBindStatusCallback
- {
- public:
- CBindCBHttpCallback(){};
- ~CBindCBHttpCallback(){};
- private:
- LPFN_NET_DL_PROGRESS lpfnProgressCallback;
- public:
- STDMETHOD(OnStartBinding)(
- DWORD dwReserved,
- IBinding __RPC_FAR *pib)
- { return E_NOTIMPL; }
- STDMETHOD(GetPriority)(
- LONG __RPC_FAR *pnPriority)
- { return E_NOTIMPL; }
- STDMETHOD(OnLowResource)(
- DWORD reserved)
- { return E_NOTIMPL; }
- STDMETHOD(OnStopBinding)(
- HRESULT hresult,
- LPCWSTR szError)
- { return E_NOTIMPL; }
- STDMETHOD(GetBindInfo)(
- DWORD __RPC_FAR *grfBINDF,
- BINDINFO __RPC_FAR *pbindinfo)
- { return E_NOTIMPL; }
- STDMETHOD(OnDataAvailable)(
- DWORD grfBSCF,
- DWORD dwSize,
- FORMATETC __RPC_FAR *pformatetc,
- STGMEDIUM __RPC_FAR *pstgmed)
- { return E_NOTIMPL; }
- STDMETHOD(OnObjectAvailable)(
- REFIID riid,
- IUnknown __RPC_FAR *punk)
- { return E_NOTIMPL; }
- STDMETHOD_(ULONG,AddRef)()
- { return 0; }
- STDMETHOD_(ULONG,Release)()
- { return 0; }
- STDMETHOD(QueryInterface)(
- REFIID riid,
- void __RPC_FAR *__RPC_FAR *ppvObject)
- { return E_NOTIMPL; }
- STDMETHOD(OnProgress)(
- ULONG ulProgress,
- ULONG ulProgressMax,
- ULONG ulStatusCode,
- LPCWSTR wszStatusText);
- VOID(SetProgressCallback)(
- LPFN_NET_DL_PROGRESS lpfn);
- };
- HRESULT
- CBindCBHttpCallback::OnProgress(
- ULONG ulProgress,
- ULONG ulProgressMax,
- ULONG ulStatusCode,
- LPCWSTR wszStatusText){
- (*lpfnProgressCallback)(ulProgress,
- ulProgressMax,
- ulStatusCode);
- return S_OK;
- }
- VOID
- CBindCBHttpCallback::SetProgressCallback(
- LPFN_NET_DL_PROGRESS lpfn){
- lpfnProgressCallback = lpfn;
- }
- //
- HRESULT
- URLDownloadProgress(
- const char* lpszURL,
- const char* lpszFile,
- LPFN_NET_DL_PROGRESS lpcallback
- )
- {
- HRESULT result;
- CBindCBHttpCallback callback;
- callback.SetProgressCallback(lpcallback);
- result = ::URLDownloadToFile(NULL,lpszURL,lpszFile,0,&callback);
- return result;
- }