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

使用 URLDownloadToCacheFile 下载文件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.69/5 (21投票s)

2002年10月26日

3分钟阅读

viewsIcon

199688

downloadIcon

7751

演示如何使用 URLDownloadToCacheFile 和 IBindStatusCallback 的示例。

Download

引言

您可以使用 WinInet 从 Internet 下载文件。 但更简单的方法是使用 ::URLDownloadToCacheFile()::URLDownloadToFile() 函数。 URL 函数将异步 Moniker 和 URL Moniker 的功能组合到易于使用的函数中。 通过使用这些函数,您无需担心用于传输文件的协议,例如 HTTP、FTP。 在最简单的情况下,您只需将 URL 传递给它们。 ::URLDownloadToCacheFile() 将数据下载到 Internet 缓存中,并返回缓存位置的文件名以检索位。 ::URLDownloadToFile() 从 Internet 下载位并将它们保存到文件中。 但是,它们是阻塞函数。 即使数据是异步下载的,这些函数也要等到所有数据都下载完毕才返回。您可以选择通过通知回调来获得进度通知。

此示例演示如何使用 ::URLDownloadToCacheFile() 函数从 Internet 下载文件,而不会阻塞用户界面。 ::URLDownloadToFile() 函数的使用类似。 该示例是一个基于 MFC 对话框的应用程序,它创建一个工作线程来执行下载任务。

用户应该在 URL 编辑框中输入 URL,然后按下载按钮。 由于下载按钮的 ID 是 IDOK,因此将调用 CUrlFileDlg::OnOK()CUrlFileDlg::OnOK() 从 URL 编辑框中检索 URL 字符串,并使用 ::IsValidURL() 函数检查其有效性。 ::IsValidURL() 函数的第二个参数应为 LPCWSTR 类型。 在这里,使用了 T2CW 转换宏。 有关 MBCS/Unicode 转换宏的更多信息,请参阅 MFC 技术说明 "TN059: 使用 MFC MBCS/Unicode 转换宏"。 如果 URL 有效(但不一定正确),则通过调用 ::AfxBeginThread() 创建一个工作线程。 工作线程的控制函数是 CUrlFileDlg 的静态成员函数 - CUrlFileDlg::Download(),它调用 ::URLDownloadToCacheFile() 并在 ::URLDownloadToCacheFile() 返回后将用户定义的消息 WM_USER_ENDDOWNLOAD 发布到对话框。 WM_USER_ENDDOWNLOAD 的消息处理函数等待工作线程终止,然后删除 CWinThread 对象。 它还显示下载的文件的名称。 ::URLDownloadToCacheFile() 的最后一个参数是调用者的 IBindStatusCallback 接口的地址。 ::URLDownloadToCacheFile() 在连接活动(包括数据的到达)时调用此接口的 IBindStatusCallback::OnProgress() 方法。 实现 IBindStatusCallback::OnProgress() 允许调用者实现用户界面或其他进度监视功能。 它还允许通过从 IBindStatusCallback::OnProgress() 调用返回 E_ABORT 来取消下载操作。 IBindStatusCallback 接口的实现是 CBSCallbackImpl 类。 CBSCallbackImpl::OnProgress() 向对话框发送用户定义的消息 WM_USER_DISPLAYSTATUS 以显示进度消息。 它还使用 ::WaitForSingleObject() 函数来检查事件对象的当前状态,该事件对象在用户在下载期间按下停止按钮(与下载按钮相同的按钮)时设置为已发出信号状态。 如果事件对象处于已发出信号状态,则 CBSCallbackImpl::OnProgress() 返回 E_ABORT 以取消下载操作。

请注意,以下设置会像 Internet Explorer 浏览器一样影响 ::URLDownloadToCacheFile() 的行为。

检查控制面板/Internet/常规/Internet 临时文件/设置/检查存储页面的较新版本

© . All rights reserved.