1。一个导出了字段(数据,全局变量)的DLL是无法延迟载入的
2。kernel32.dll是无法延迟载入的.因为载入该模块才能调用LoadLibrary和GetProcAddress
3。不应该在DllMain入口点函数中调用一个延迟载入的函数,因为这样可能会导致程序崩溃.
注意第二条,看,看,看到了没 "因为载入该模块才能调用LoadLibrary"
也就是说, 如果静态连接的函数选用了延迟导入,那么加载函数也会用到LoadLibrary,再想想SetDllDirectory, 想到了什么呢
没错,我们甚至可以调用SetDllDirectory函数来指定隐式联结的DLL模块的路径,只要在调用该DLL的函数之前先调用SetDllDirectory
//
//
延迟DLL的设置位置: Configuration Properties/Linker/Input ------ Delay Loaded DLLs
/DELAYLOAD:"MyDealyLoadedDLL.dll"
可以设置多个延迟DLL
如果想在程序中卸载延迟载入的DLL
需要设置另一开关: Configuration Properties/Linker/Advanced ----------------- Delay Loaded DLL
/DELAY:UNLOAD
在代码中调用
ExternC
BOOL WINAPI
__FUnloadDelayLoadedDLL2(LPCSTR szDll);
来卸载一个延迟加载的DLL
不要直接用FreeLibrary, 不然已经加载的函数地址不会重置,下次再调到延迟DLL的函数会导致程序崩溃.
调用__FUnloadDelayLoadedDLL2时候传入的DLL名字不应该包含路径,并且名字中字母的大小写必须和传入/DelayLoad链接器开关的DLL名字大小写完全相同.