65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Internet Explorer 为您下载文件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.93/5 (36投票s)

1999 年 12 月 28 日

viewsIcon

802793

downloadIcon

10059

本文介绍了使用 IE3+ 中的 URLDownloadToFile 函数下载文件的两种方法。

  • 下载演示项目 - 23 Kb

    Sample Image - URLDownload.gif

    使用 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_NOTIMPLOnProgress() 的原型是

    HRESULT OnProgress(
        ULONG  ulProgress,
        ULONG  ulProgressMax,
        ULONG  ulStatusCode,
        LPCWSTR  szStatusText );
    ulProgress
    是到目前为止下载的字节数。
    ulProgressMax
    是文件的大小,如果大小未知,则为零。请注意,从技术上讲,此值可能会在对 OnProgress() 的调用之间发生变化,因此您不应将该值存储在静态变量中;您应该在每次调用该函数时检查该值。
    ulStatusCode
    是一个数字,指示下载是否正在进行中。该值可以是 BINDSTATUS_BEGINDOWNLOADCOMPONENTSBINDSTATUS_INSTALLINGCOMPONENTSBINDSTATUS_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/ 找到此文章和我的其他文章的最新更新

  • © . All rights reserved.