Download a File Using URLDownloadToCacheFile | CodeGuru

Download a File Using URLDownloadToCacheFile

This article was contributed by chensu. Environment: Visual C++ 6.0 with Service Pack 3, Windows 9x and Windows NT 4.0 with Service Pack 3 You can use WinInet to download a file from the Internet. But the easier way is to use the ::URLDownloadToCacheFile or ::URLDownloadToFile functions. The URL functions combine the capabilities of asynchronous […]

Written By
CodeGuru Staff
CodeGuru Staff
Oct 29, 2002
3 minute read
CodeGuru content and product recommendations are editorially independent. We may make money when you click on links to our partners. Learn More

This article was contributed by
chensu.

The User Interface

Environment: Visual C++ 6.0 with Service Pack 3, Windows 9x and Windows NT 4.0 with Service Pack 3

You can use WinInet to download a file from the Internet. But the easier way is to use
the ::URLDownloadToCacheFile or ::URLDownloadToFile functions. The URL functions combine the
capabilities of asynchronous monikers and URL monikers into easy-to-use functions. By using
these functions, you do not have to worry about the protocols used to transfer the files,
such as HTTP, FTP. In the simplest case, all you have to do is to pass them the URL.
::URLDownloadToCacheFile downloads data into the Internet cache and returns the file name of
the cache location for retrieving the bits. ::URLDownloadToFile downloads bits from the
Internet and saves them to a file. However, they are blocking functions. Even though the data
is downloaded asynchronously the functions do not return until all the data is downloaded.
You can choose to be notified of progress through a notification callback.

This sample demonstrates how to use the ::URLDownloadToCacheFile function to download a
file from the Internet without blocking the user interface. The use of the ::URLDownloadToFile
function is similar. The sample is an MFC dialog-based application that creates a worker thread
to perform the download task.

The user is supposed to enter the URL in the URL edit box and then press the Download button.
The CUrlFileDlg::OnOK will be called since the ID of the Download button is IDOK. The
CUrlFileDlg::OnOK retrieves the URL string from the URL edit box and checks its validity
using the ::IsValidURL function. The second parameter of the ::IsValidURL function is expected
to be of the LPCWSTR type. Here, the T2CW conversion macro is used. For more information about
MBCS/Unicode Conversion Macros, see the MFC Technical Note “TN059: Using MFC MBCS/Unicode
Conversion Macros”. If the URL is valid (but it is not necessarily correct), a worker thread
is created by calling ::AfxBeginThread. The controlling function for the worker thread is a
static member function of CUrlFileDlg – CUrlFileDlg::Download, which calls ::URLDownloadToCacheFile
and posts a user-defined message WM_USER_ENDDOWNLOAD to the dialog box after ::URLDownloadToCacheFile
returns. The message-handler function for WM_USER_ENDDOWNLOAD waits until the worker thread
terminates, then deletes the CWinThread object. It also displays the name of the downloaded file.
The last parameter of ::URLDownloadToCacheFile is the address of the caller’s
IBindStatusCallback interface. ::URLDownloadToCacheFile calls this interface’s IBindStatusCallback::OnProgress
method on a connection activity, including the arrival of data. Implementing IBindStatusCallback::OnProgress
allows a caller to implement a user interface or other progress monitoring functionality.
It also allows the download operation to be canceled by returning E_ABORT from the
IBindStatusCallback::OnProgress call. The implementation of the IBindStatusCallback interface
is the CBSCallbackImpl class. The CBSCallbackImpl::OnProgress sends a user-defined message
WM_USER_DISPLAYSTATUS to the dialog box to display the progress messages. It also uses the
::WaitForSingleObject function to check the current state of the event object, which is set
to the signaled state when the user has pressed the Stop button (the same button as the Download
button) during downloading. If the event object is in the signaled state, the CBSCallbackImpl::OnProgress
returns E_ABORT to cancel the download operation.

Note that the following setting affects the behavior of ::URLDownloadToCacheFile just like
the Internet Explorer browser.

Control Panel/Internet/General/Temporary Internet files/Settings/Check for newer versions of stored pages

Downloads

Download Source Code – 84KB (New updated file)

CodeGuru Logo

CodeGuru covers topics related to Microsoft-related software development, mobile development, database management, and web application programming. In addition to tutorials and how-tos that teach programmers how to code in Microsoft-related languages and frameworks like C# and .Net, we also publish articles on software development tools, the latest in developer news, and advice for project managers. Cloud services such as Microsoft Azure and database options including SQL Server and MSSQL are also frequently covered.

Property of TechnologyAdvice. © 2026 TechnologyAdvice. All Rights Reserved

Advertiser Disclosure: Some of the products that appear on this site are from companies from which TechnologyAdvice receives compensation. This compensation may impact how and where products appear on this site including, for example, the order in which they appear. TechnologyAdvice does not include all companies or all types of products available in the marketplace.