Share via


Changes in the DLL Delayed Loading Helper Function Since Visual C++ 6.0

 

The latest version of this topic can be found at Changes in the DLL Delayed Loading Helper Function Since Visual C++ 6.0.

If you have multiple versions of Visual C++ on your computer or if you defined your own helper function, you may be affected by changes made to the DLL delayed loading helper function. For example:

  • __delayLoadHelper is now __delayLoadHelper2

  • __pfnDliNotifyHook is now __pfnDliNotifyHook2

  • __pfnDliFailureHook is now __pfnDliFailureHook2

  • __FUnloadDelayLoadedDLL is now __FUnloadDelayLoadedDLL2

Note

If you are using the default helper function, these changes will not affect you. There are no changes regarding how you invoke the linker.

Multiple Versions of Visual C++

If you have multiple versions of Visual C++ on your computer, make sure the linker matches delayimp.lib. If there is a mismatch, you will get a linker error reporting either ___delayLoadHelper2@8 or ___delayLoadHelper@8 as an unresolved external symbol. The former implies a new linker with an old delayimp.lib, and the latter implies an old linker with a new delayimp.lib.

If you get an unresolved linker error, run dumpbin /linkermember:1 on the delayimp.lib that you expect to contain the helper function to see which helper function is defined instead. The helper function could also be defined in an object file; run dumpbin /symbols and look for delayLoadHelper(2).

If you know you have the Visual C++ 6.0 linker, then:

  • Run dumpbin on the delay load helper's .lib or .obj file to determine whether it defines __delayLoadHelper2. If not, the link will fail.

  • Define __delayLoadHelper in the delay load helper's .lib or .obj file.

User-Defined Helper Function

If you defined your own helper function and are using the current version of Visual C++, do the following:

  • Rename the helper function to __delayLoadHelper2.

  • Since the pointers in the delay descriptor (ImgDelayDescr in delayimp.h) have been changed from absolute addresses (VAs) to relative addresses (RVAs) to work as expected in both 32- and 64-bit programs, you need to convert these back to pointers. A new function has been introduced: PFromRva, found in delayhlp.cpp. You can use this function on each of the fields in the descriptor to convert them back to either 32- or 64-bit pointers. The default delay load helper function continues to be a good template to use as an example.

Load All Imports for a Delay-Loaded DLL

The linker can load all imports from a DLL that you specified to be delay loaded. See Loading All Imports for a Delay-Loaded DLL for more information.

See Also

Understanding the Helper Function