使用URLDownloadToFile()下载文件及超时处理

在进行网络文件下载时,经常需要考虑如何优雅地处理下载过程中可能出现的各种问题,如网络不稳定导致的下载失败、下载速度过慢等。其中,超时处理是一个重要的功能,它可以帮助控制下载时间,避免因长时间等待而影响用户体验。本文将介绍如何使用IE提供的URLDownloadToFile()函数来下载文件,并实现超时处理。

URLDownloadToFile()函数简介

URLDownloadToFile()函数是IE 3及以后版本提供的一个简单而强大的下载工具。它允许开发者在不显示任何用户界面的情况下,通过编程方式下载文件。函数的原型如下:

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

其中,参数的含义如下:

  • pCaller:如果是ActiveX对象调用此函数,则需要提供此参数;否则可以为NULL。
  • szURL:要下载文件的绝对URL。
  • szFileName:要创建的文件的完整路径。
  • dwReserved:必须为0。
  • lpfnCB:指向IBindStatusCallback接口的指针,IE通过此接口通知下载进度。

使用步骤

要使用URLDownloadToFile()函数,需要遵循以下步骤:

  1. 获取要下载文件的URL。
  2. 构建要创建文件的完整路径。
  3. 创建一个继承自IBindStatusCallback的类,并编写OnProgress()函数。
  4. 实例化该类的实例。
  5. 调用URLDownloadToFile()函数。注意,此函数是同步的,因此建议在工作线程中调用。

IBindStatusCallback接口

IBindStatusCallback接口包含八个方法,但在下载文件时,只需要关注OnProgress()方法。其他方法可以返回E_NOTIMPL。OnProgress()方法的原型如下:

HRESULT OnProgress( ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText );

参数的含义如下:

  • ulProgress:到目前为止已下载的字节数。
  • ulProgressMax:文件的大小,如果大小未知,则为0。
  • ulStatusCode:指示下载进度的状态码。
  • szStatusText:适合在用户界面中显示的字符串。

OnProgress()方法返回S_OK表示继续下载,返回E_ABORT表示中止下载。

ATL方式

如果查看过MSDN文档,可能会发现ATL提供了一个CBindStatusCallback类,它实现了IBindStatusCallback接口。使用CBindStatusCallback时,需要提供一个包含几个成员函数的对象,ATL会在下载过程中回调这些函数。这个对象作为模板参数"T"传递给CBindStatusCallback

使用这个类需要更多的工作,因为需要提供一个存储传入数据的函数。而使用URLDownloadToFile()时,数据会自动保存。

示例项目

文章开头的截图来自示例项目的应用程序。可以输入要下载文件的URL和系统上的目标文件的完整路径,然后点击开始。还可以输入超时时间(秒),如果下载在指定时间内未完成,应用程序将中止下载。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485