使用 URLDownloadToCacheFile 下载文件






4.69/5 (21投票s)
2002年10月26日
3分钟阅读

199688

7751
演示如何使用 URLDownloadToCacheFile 和 IBindStatusCallback 的示例。
引言
您可以使用 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 临时文件/设置/检查存储页面的较新版本