Constraints of Delay Loading DLLs
There are constraints regarding the delay loading of imports.
- Imports of data cannot be supported. A workaround is to explicitly handle the data import yourself using LoadLibrary (or GetModuleHandle after you know the delay-load helper has loaded the DLL) and GetProcAddress.
- Delay loading Kernel32.dll not supported. This DLL is necessary for the delay-load helper routines to perform the delay loading.
- Binding of entry points that are forwarded is not supported.
- Delay loading of a DLL may not result in the same behavior of the process if there are per-process initializations that occur in the entry point of the delay-loaded DLL. Other cases include static TLS (thread local storage, declared using __declspec(thread) which is not handled when the DLL is loaded via LoadLibrary. Dynamic TLS, using TlsAlloc, TlsFree, TlsGetValue, TlsSetValue is still available for use in either static or delay-loaded DLLs.
- Static (global) function pointers should be reinitialized to imported functions after the first call to the function. This is because the first use of the function pointer will point to the thunk.