How To Download Dependent DLLs in Internet Explorer with an .inf File

This article was previously published under Q165075
It is often necessary to download dependent DLLs along with an ActiveXControl. MFC and Visual Basic controls have this requirement. This articlewill explain three ways that you can do this.
There are three ways to include dependent DLLs in the download for acontrol. The first way is to include the DLL(s) in the CAB file for thecontrol along with the OCX and INF files. The downside of this is that theDLL will be downloaded any time the control is downloaded. In some cases,this is appropriate. The next way is to package the dependent DLL(s) in aseparate CAB file and refer to that in the INF file for the control. Thethird way also packages the DLL in a separate CAB file but the CAB file isreferred to in the control's INF file with a hook. Using a hook allows thedownload process to execute an INF or EXE file contained in the dependentCAB file.

To add a dependency for an OCX (Simpdll.dll in this example), a sectionsimilar to the section for the control is added to the [AddCode] section ofthe INF file:
   [Add.Code]   TestDw.ocx=TestDw.ocx   simpdll.dll=simpdll.dll				
A section is then added to the INF file to control the installation of theDLL:
   [simpdll.dll]   FileVersion=1,0,0,1   file-win32-x86=thiscab				
This is the first way mentioned to include a DLL dependency in a download.

To include the DLL in a separate CAB file, all that is necessary is tochange the location from "thiscab" to the URL at which the dependent CABwill be located:
In this case, contains only simpdll.dll.

Multiple DLLs can be added to the INF and CAB files above if necessary.

The third way to package dependent DLLs is to refer to the dependent DLL's CAB file using a hook. With this technique, an INF or EXE file in thedependent CAB can be executed on download.

The following section from an .inf file controls the dependent DLL downloadfor MFC controls:
   [Add.Code]   ...   msvcrt.dll=msvcrt.dll   mfc42.dll=mfc42.dll   olepro32.dll=olepro32.dll   [msvcrt.dll]   FileVersion=4,20,0,6164   hook=mfc42installer   ...   [mfc42installer]   file-win32-x86=   run=%EXTRACT_DIR%\mfc42.exe				
In this case, the MFC DLLs are packaged in a self-extracting .exe file,which is contained in the .cab file ( However, tools to makeself-extracting .exe files are not currently available from Microsoft.Therefore, you will either need to package dependent DLLs with an .inf fileor reference the .inf file in the installation hook:
   [yourinstaller]   file-win32-x86=   InfFile=your.inf				
Or, you will need to build a self extracting EXE file using third partytools.

To illustrate, the following is the .inf file used to install the dependentMFC DLLs. You can modify this to install your own DLLs in the same waythat the MFC DLLs are installed.
   ; ========================= Mfc42.inf =========================   ; This file will control the download of the MFC 4.2 DLLs   [version]   ; version signature (same for both NT and Win95) do not remove   signature="$CHICAGO$"   AdvancedINF=2.0   [SourceDisksNames]   ; This section specifies that all sources are in the "default"   ; location.   1="default",,1   [DefaultInstall]   ; Default section to process and copy all files under the section   ; mfcdllsx.files and Register DLLs under the section mfcdllsx.register.   CopyFiles=mfcdllsx.files   RegisterOCXs=mfcdllsx.register   [DestinationDirs]   ; Destination Directories for CopyFiles Sections.   ; 11 indicates LDID_SYS - system directory   mfcdllsx.files=11   [mfcdllsx.files]   ; ,,,32 - Suppress version conflict dialog and don't overwrite newer   ; DLLs   msvcrt.dll,,,32   mfc42.dll,,,32   olepro32.dll,,,32   [mfcdllsx.register]   ; msvcrt.dll is not self registering   %11%\mfc42.dll   %11%\olepro32.dll   ; ====================== Mfc42.inf ======================				
A DLL needs to be listed in the .register section if it exports aDllRegisterServer function. This can be determined by examining the DLLwith the Visual C compiler's Dumpbin.exe utility. You can also runRegsvr32 on the DLL, which attempts to register the DLL. Regsvr32 loadsthe DLL, verifies that DllRegisterServer is properly exported by callingGetProcAddress() on the DLLRegisterServer function. If it succeeds, thefunction DllRegisterServer is exported and is then called.

Beware, however, that running Regsvr32 on the DLL may have undesirableside effects. When DllRegisterServer is called, it makes appropriateregistry entries pointing to the DLL location on the machine. For example,typing the following in an MS-DOS prompt, for test purposes, can causeproblems:
   copy mfc42.dll C:\Test   run "D:\msdev\bin\REGSVR32.EXE C:\Test\mfc42.dll"   delete mfc42.dll				
The next time the system tries to look for Mfc42.dll, it looks up theregistry, finds that the file is mapped to C:\Test\Mfc42.dll, and doesn'tfind it there. Running Regsvr32 on a file that is already installed on amachine does not cause problems.

Installing a DLL with a hook and a self extracting EXE is useful for thefollowing reason: If a DLL that needs to be upgraded is already loaded inmemory, the download will fail. This is a known problem, which has beenfixed in Internet Explorer version 4.0. Internet Explorer 4.0 will suggesta reboot and load the new DLL during the reboot.
For additional information, please see the following articles in the Microsoft Knowledge Base:
167158 How To Package MFC Controls for Use Over the Internet
167597 Specifying FileVersion and #Version for Component Download

For more information, see the following Webcast:

Αναγνωριστικό άρθρου: 165075 - Τελευταία αναθεώρηση: 09/28/2011 05:14:00 - Αναθεώρηση: 3.0

Windows Internet Explorer 8, Windows Internet Explorer 8 on Windows Server

  • kbcode kbdownload kbfaq kbhowto KB165075