使用 Internet Explorer 为您下载文件






4.93/5 (36投票s)
1999 年 12 月 28 日

802793

10059
本文介绍了使用 IE3+ 中的 URLDownloadToFile 函数下载文件的两种方法。
使用 URLDownloadToFile() 下载
前段时间,Chris Maunder 在一个论坛上发帖询问如何下载文件,并且能够在超时后中止下载。一个解决方案是 IE 3 及更高版本提供的名为 URLDownloadToFile()
的函数。这个函数非常简单 - 只需提供一个 URL、一个文件名和一个用于处理进度回调的对象,IE 就会处理剩下的事情!
任何应用程序都可以很容易地使用此函数。在下载过程中,IE 不会显示任何 UI,因此调用者可以提供任何所需的进度指示器。IE 会通知调用者下载进度,因此显示进度 UI 也非常容易。
URLDownloadToFile()
的原型是
HRESULT URLDownloadToFile( LPUNKNOWN pCaller, LPCSTR szURL, LPCSTR szFileName, DWORD dwReserved, LPBINDSTATUSCALLBACK lpfnCB);
pCaller
- 仅当调用者是 ActiveX 对象时才使用。如果调用应用程序不是 ActiveX 对象,则此参数可以为 NULL。
szURL
- 是要下载的文件的绝对 URL。
szFileName
- 包含要创建的文件的完全限定名称。
dwReserved
- 必须为零。
lpfnCB
- 是指向
IBindStatusCallback
接口的指针,IE 使用该接口通知您下载进度。
使用 URLDownloadToFile()
涉及的步骤是
- 获取要下载的文件的 URL。
- 构造要创建的文件的完全限定路径。
- 创建一个
IBindStatusCallback
派生类,并为其编写一个OnProgress()
函数。 - 实例化该类的一个对象。
- 调用
URLDownloadToFile()
。该调用是同步的,因此您可能希望从工作线程调用该函数。 - 在您的
OnProgress()
函数中,提供您想要的任何进度指示器或其他 UI。OnProgress()
的返回值告诉 IE 是继续下载还是中止下载。
使用 IBindStatusCallback
IBindStatusCallback
有八个方法,但对于下载而言,您只需要关注 OnProgress()
函数。其他函数可以只返回 E_NOTIMPL
。OnProgress()
的原型是
HRESULT OnProgress( ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText );
ulProgress
- 是到目前为止下载的字节数。
ulProgressMax
- 是文件的大小,如果大小未知,则为零。请注意,从技术上讲,此值可能会在对
OnProgress()
的调用之间发生变化,因此您不应将该值存储在静态变量中;您应该在每次调用该函数时检查该值。 ulStatusCode
- 是一个数字,指示下载是否正在进行中。该值可以是
BINDSTATUS_BEGINDOWNLOADCOMPONENTS
、BINDSTATUS_INSTALLINGCOMPONENTS
或BINDSTATUS_ENDDOWNLOADCOMPONENTS
。 szStatusText
- 是一个适合在 UI 中使用的字符串(如果您想使用 IE 提供的内容)。此文本非常简单,您可能希望为您的进度 UI 使用更实质性的内容。请注意,从技术上讲,此参数可能为 NULL,因此请务必在使用前检查该值。
OnProgress()
返回 S_OK
以告诉 IE 继续下载,或返回 E_ABORT
以中止下载。
ATL 方式
如果您查看过 MSDN 文档,您可能已经看到 ATL 有一个 CBindStatusCallback
类。此类为您实现 IBindStatusCallback
。使用 CBindStatusCallback
时,您需要向 ATL 提供一个对象,该对象具有一些成员函数,ATL 将在下载过程中回调这些函数。该对象作为模板参数 "T" 在 CBindStatusCallback<T>
中提供给 ATL。
然而,使用这个类涉及更多的工作,因为您必须提供一个存储传入数据的函数。当您使用 URLDownloadToFile()
时,数据会自动为您保存。
示例项目
本文开头的屏幕截图来自示例项目的应用程序。您输入要下载的文件的 URL 以及系统上目标文件的完整路径,然后单击“开始”。您还可以输入超时时间(以秒为单位),如果下载完成之前经过了该时间长度,该应用程序将中止下载。
您可以在 http://home.inreach.com/mdunn/code/ 找到此文章和我的其他文章的最新更新