-一個延遲載入的DLL是隱式鏈接的,系統(tǒng)一開始不會將該DLL載入鞋怀,只有當我們的代碼試圖去引用DLL中包含的一個符號時迂求,系統(tǒng)才會實際載入該DLL霞怀。
用處:
-將載入DLL的過程延伸到進程的執(zhí)行過程中传货。
-解決函數(shù)版本和操作系統(tǒng)版本匹配的問題屎鳍。
局限:
-一個導出了字段的DLL無法延遲載入。(全局變量)
-Kernel32.dll無法延遲載入问裕。因為載入該DLL才能調用LoadLibrary和GetProcAddress
-不應該在DLLMain入口點函數(shù)調用延遲載入的函數(shù)逮壁。(可能會導致程序崩潰)
使用:
-代碼的編寫和正常使用相同
-DLL鏈接選擇隱式鏈接
-設置/DELAYLOAD和/DELAY鏈接器開關。這兩個不能用#pragma comment(...)來設置粮宛,要在項目屬性中設置貌踏。
1. 屬性--Linker--Input--Delay Load DLLs--在這一項里填要延遲載入的DLL,注意窟勃,不要加路徑。
2. 屬性--Linker--Advanced--Delay Loaded DLL --這一項選擇 Support Unload(/DELAY:UNLOAD)逗堵。
這樣設置完之后加載DLL就是在使用DLL的元素的時候了秉氧。
在使用時,為了方便看出來是在哪里加載的蜒秤,加了一個判斷DLL是否被載入的函數(shù)汁咏。如下
BOOL IsModuleLoaded(PCTSTR pszModuleName)
{
HMODULE hmod = GetModuleHandle(pszModuleName);
if(hmod==NULL)
return FALSE;
return TRUE;
}
-其中pszModuleName參數(shù)是dll的名稱(不加.dll)亚斋。
-在第一次調用dll中的函數(shù)的前后,IsModuleLoaded分別返回FALSE和TRUE攘滩。