How to implement a custom download manager

Article translations Article translations
Article ID: 327865
This article was previously published under Q327865
Expand all | Collapse all

On This Page

Summary

This step-by-step article describes how to implement a custom download manager in Microsoft Internet Explorer 5.5 and Microsoft Internet Explorer 6. With this feature, you can extend the functionality of Internet Explorer and WebBrowser applications by implementing a Component Object Model (COM) object to handle the file download process.

By implementing a custom download manager, your WebBrowser application or Internet Explorer can be extended to display a custom user interface. A download manager is implemented as a COM object that exposes the IUnknown interface and the IDownloadManager interface. IDownloadManager has only one method, IDownloadManager::Download. The IDownloadManager::Download method is called by Internet Explorer or by a WebBrowser application to download a file. When a file is selected for download in a WebBrowser application, the custom download manager is accessed in one of two ways:
  • In Internet Explorer 5.5 and later versions, if the IServiceProvider::QueryService method of the IServiceProvider interface is implemented, the WebBrowser application first calls IServiceProvider::QueryService to retrieve an IDownloadManager interface pointer. For a possible implementation of the IServiceProvider::QueryService method, see the "Code sample" section of this article.
  • For Internet Explorer 6 and later, if the WebBrowser application does not implement the IServiceProvider::QueryService method, or when you use Internet Explorer itself (IServiceProvider::QueryService cannot be implemented in Internet Explorer), the application checks for a registry value that contains the class identifier (CLSID) of the download manager COM object. The CLSID can be provided in either of the following registry values:
    \HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\DownloadUI

    \HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\DownloadUI


    Note DownloadUI is a string value. The value is the CLSID of the download manager COM object.
For a detailed implementation, see the "Code sample" section of the article.

Note The IServiceProvider approach does not work when you right-click a link and then click Save Target As. Registering the download manager DLL always works.

Requirements

The following list outlines the recommended hardware, software, network infrastructure, and service packs that you need for this procedure:
  • Microsoft Visual Studio 6
  • Microsoft Internet Explorer 5.5 Service Pack 2 and later

Download headers and libraries

You must download the Internet Explorer headers and libraries for both Internet Explorer 5.5 and Internet Explorer 6, and then add them to the include and library directories. To do this, visit the following Microsoft Developer Network (MSDN) Web sites:

For Internet Explorer 5.5For Internet Explorer 6

Code sample

Internet Explorer 5.5
// This is a custom download manager implementation for Internet Explorer 5.5 SP2.
#include "downloadmgr.h"
STDMETHOD(QueryService)(REFGUID guidService,REFIID riid,void** ppv)
{
    HRESULT hr = E_NOINTERFACE;   
    if (guidService == SID_SDownloadManager && riid == IID_IDownloadManager)
    {
        // Create a new CDownloadMgr object by using ATL.
        CComObject<CDownloadMgr>* pDownloadMgr;
        hr = CComObject<CDownloadMgr>::CreateInstance(&pDownloadMgr);
        // Query the new CDownloadMgr object for the IDownloadManager interface.
        hr = pDownloadMgr->QueryInterface(IID_IDownloadManager, ppv);
        // Call the Download method.

        // -or-
     
        // Call the Download method directly if you implement it in this class.
        // Download(NULL,NULL,0,0,NULL,NULL,NULL,0);
        // hr = S_OK;
    }

    return hr;
}
				
Internet Explorer 6
// This is the custom download manager implementation for Internet Explorer 6 or later.
// In the .h file of the COM DLL.
#include "downloadmgr.h"
STDMETHOD(Download)(IMoniker* pmk,
		IBindCtx* pbc,
		DWORD dwBindVerb,
		LONG grfBINDF,
		BINDINFO* pBindInfo,
		LPCOLESTR pszHeaders,
		LPCOLESTR pszRedir,
		UINT uiCP );
// In the .cpp file.
STDMETHODIMP CDownload::Download(IMoniker* pmk,
		IBindCtx* pbc,
		DWORD dwBindVerb,
		LONG grfBINDF,
		BINDINFO* pBindInfo,
		LPCOLESTR pszHeaders,
		LPCOLESTR pszRedir,
		UINT uiCP )
{
	::MessageBox(NULL,"Download","Download Manager",MB_OK);
	return S_OK;	
}
				

Properties

Article ID: 327865 - Last Review: September 29, 2012 - Revision: 4.0
Keywords: 
kbhowtomaster KB327865
Retired KB Content Disclaimer
This article was written about products for which Microsoft no longer offers support. Therefore, this article is offered "as is" and will no longer be updated.

Give Feedback

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com