Delphi编写下载程序:UrlDownloadToFile的进度提示

本文介绍如何在Delphi程序中利用UrlDownloadToFile函数进行文件下载,并实现下载进度的实时提示。通过监控下载过程,为用户提供更好的交互体验。
摘要由CSDN通过智能技术生成

urlmon.dll中有一个用于下载的API,MSDN中的定义如下:

HRESULT URLDownloadToFile(      
      LPUNKNOWN pCaller,
      LPCTSTR szURL,
     LPCTSTR szFileName,
      DWORD dwReserved,
      LPBINDSTATUSCALLBACK lpfnCB
);

Delphi的UrlMon.pas中有它的Pascal声明:

   function URLDownloadToFile(      
      pCaller: IUnKnown,
     szURL: PAnsiChar,
      szFileName: PAnsiChar,
      dwReserved: DWORD,
      lpfnCB: IBindStatusCallBack;
   );HRESULT;stdcall;

szURL是要下载的文件的URL地址,szFileName是另存文件名,dwReserved是保留参数,传递0。如果不需要进度提示的话,调用这个函数很简单。比如要下载http://218.95.47.224/page/jxzy/XSZB/web/fourteens/Music/qili.mp3 这首歌,并保存为D:/ Music/七里香.mp3,就可以这样调用:

   URLDownloadToFile(nil,'http://218.95.47.224/page/jxzy/XSZB/web/fourteens/Music/qili.mp3 ','D:/ Music/七里香.mp3',0,nil);

不过这样做的缺点是没有进度提示,而且会阻塞调用线程。如果要获得进度提示就要用到最后一个参数lpfnCB了,它是一个接口类型IBindStatusCallBack,定义如下:


IBindStatusCallback 
=   interface
    [
' {79eac9c1-baf9-11ce-8c82-00aa004ba90b} ' ]
    
function  OnStartBinding(dwReserved :  DWORD; pib :  IBinding) :  HResult; stdcall;
    
function  GetPriority(out nPriority) :  HResult; stdcall;
    
function  OnLowResource(reserved :  DWORD) :  HResult; stdcall;
    
function  OnProgress(ulProgress ,  ulProgressMax ,  ulStatusCode :  ULONG;
      szStatusText
:  LPCWSTR) :  HResult; stdcall;
    
function  OnStopBinding(hresult :  HResult; szError :  LPCWSTR) :  HResult; stdcall;
    
function  GetBindInfo(out grfBINDF :  DWORD;  var  bindinfo :  TBindInfo) :  HResult; stdcall;
    
function  OnDataAvailable(grfBSCF :  DWORD; dwSize :  DWORD; formatetc :  PFormatEtc;
      stgmed
:  PStgMedium) :  HResult; stdcall;
    
function  OnObjectAvailable( const  iid :  TGUID; punk :  IUnknown) :  HResult; stdcall;
end ;


进度提示就靠这个接口的OnProgress方法了。我们可以定义一个实现 IBindStatusCallback 接口的类,只处理一下OnProgress方法就可以了,其它方法咱啥都不做,就返回S_OK。下面简要说一下OnProgress:

ulProgress :当前进度值
ulProgressMax :总进度
ulStatusCode: 状态值,是tagBINDSTATUS枚举。表明正在寻找资源啊,正在连接啊这些状态。具体请查看MSDN,我们这里不需要关心它
szStatusText:状态字符串,咱也不关心它

所以我们用百分比来表示进度的话就是FloatToStr(ulProgress*100/ulProgressMax)+'/%',简单吧。如果要在下载完成前取消任务,可以在OnProgress中返回E_ABORT。
我把UrlDownloadToFile及其进度提示功能都封装进了一个线程类中,这个类的源码如下:

{ Delphi  File  Download Thread  Class   ,  Copyright (c) Zhou Zuoji }

unit FileDownLoadThread;

interface

uses
    Classes
,
    SysUtils
,
    Windows
,
    ActiveX
,
    UrlMon;
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值