URLDownloadToFile进度回调

下面进行了简单的封装.使用时实现一个 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.
  1. // interface for the downloadprogress class.
  2. #if !defined(URLDOWNLOADPROGRESS_H)
  3. #define URLDOWNLOADPROGRESS_H
  4. #include <Urlmon.h>
  5. #pragma comment(lib, "Urlmon.lib")
  6. typedef void (*LPFN_NET_DL_PROGRESS)(
  7.     unsigned long ulProgress,
  8.     unsigned long ulProgressMax,
  9.     unsigned long ulState);
  10. HRESULT URLDownloadProgress(
  11.     const char* lpszURL,
  12.     const char* lpszFile,
  13.     LPFN_NET_DL_PROGRESS lpcallback);
  14. #endif // !defined(URLDOWNLOADPROGRESS_H)
  15. // implementation of the downloadprogress class.
  16. #include "stdafx.h"
  17. #include "urldownloadprogress.h"
  18. //
  19. // CBindCBHttpCallback
  20. //
  21. class CBindCBHttpCallback : public IBindStatusCallback
  22. {
  23. public:
  24.     CBindCBHttpCallback(){};
  25.     ~CBindCBHttpCallback(){}; 
  26. private:
  27.     LPFN_NET_DL_PROGRESS lpfnProgressCallback;
  28. public:
  29.     STDMETHOD(OnStartBinding)(
  30.         DWORD dwReserved,
  31.     IBinding __RPC_FAR *pib)
  32.     { return E_NOTIMPL; }
  33.     
  34.     STDMETHOD(GetPriority)(
  35.         LONG __RPC_FAR *pnPriority)
  36.     { return E_NOTIMPL; }
  37.     
  38.     STDMETHOD(OnLowResource)(
  39.         DWORD reserved)
  40.     { return E_NOTIMPL; }
  41.     
  42.     STDMETHOD(OnStopBinding)(
  43.         HRESULT hresult,
  44.         LPCWSTR szError)
  45.     { return E_NOTIMPL; }
  46.     
  47.     STDMETHOD(GetBindInfo)(
  48.         DWORD __RPC_FAR *grfBINDF,
  49.         BINDINFO __RPC_FAR *pbindinfo)
  50.     { return E_NOTIMPL; }
  51.     
  52.     STDMETHOD(OnDataAvailable)(
  53.         DWORD grfBSCF,
  54.         DWORD dwSize,
  55.         FORMATETC __RPC_FAR *pformatetc,
  56.         STGMEDIUM __RPC_FAR *pstgmed)
  57.     { return E_NOTIMPL; }
  58.     
  59.     STDMETHOD(OnObjectAvailable)(
  60.         REFIID riid,
  61.         IUnknown __RPC_FAR *punk)
  62.     { return E_NOTIMPL; }
  63.     
  64.     STDMETHOD_(ULONG,AddRef)()
  65.     { return 0; }
  66.     
  67.     STDMETHOD_(ULONG,Release)()
  68.     { return 0; }
  69.     
  70.     STDMETHOD(QueryInterface)(
  71.         REFIID riid,
  72.         void __RPC_FAR *__RPC_FAR *ppvObject)
  73.     { return E_NOTIMPL; }
  74.     
  75.     STDMETHOD(OnProgress)(
  76.         ULONG ulProgress,
  77.         ULONG ulProgressMax,
  78.         ULONG ulStatusCode,
  79.         LPCWSTR wszStatusText);
  80.     VOID(SetProgressCallback)(
  81.         LPFN_NET_DL_PROGRESS lpfn);
  82. };
  83. HRESULT 
  84. CBindCBHttpCallback::OnProgress(
  85.     ULONG ulProgress,
  86.     ULONG ulProgressMax,
  87.     ULONG ulStatusCode,
  88.     LPCWSTR wszStatusText){
  89.     (*lpfnProgressCallback)(ulProgress,
  90.                             ulProgressMax,
  91.                             ulStatusCode);
  92.     return S_OK;
  93. }
  94. VOID
  95. CBindCBHttpCallback::SetProgressCallback(
  96.     LPFN_NET_DL_PROGRESS lpfn){
  97.     lpfnProgressCallback = lpfn;
  98. }
  99. //
  100. HRESULT
  101. URLDownloadProgress(
  102.     const char* lpszURL,
  103.     const char* lpszFile,
  104.     LPFN_NET_DL_PROGRESS lpcallback
  105. )
  106. {
  107.     HRESULT result;
  108.     CBindCBHttpCallback callback;
  109.     callback.SetProgressCallback(lpcallback);
  110.     result = ::URLDownloadToFile(NULL,lpszURL,lpszFile,0,&callback);
  111.     return result;
  112. }

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白錵錵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值