2011-12-15 66 views
2

有時,我讀了源代碼,發現模塊像下面那樣手動加載。爲什麼在運行時加載模塊?

HMODULE hmodMscoree = LoadLibraryEx(L"mscoree.dll", NULL, 0); 
typedef HRESULT (STDAPICALLTYPE *GETCORVERSION)(LPWSTR szBuffer, DWORD cchBuffer, DWORD* dwLength); 
GETCORVERSION pfnGETCORVERSION = (GETCORVERSION)GetProcAddress(hmodMscoree, "GetCORVersion"); 

它爲什麼在運行時加載mscoree.dll?

此致

+1

因爲他們需要`GetCORVersion`函數。 – 2011-12-15 02:23:39

回答

2

一個優點是,如果加載DLL 動態,則DLL的存在(例如MSCorEE.dll中),和一個功能中的DLL(例如GetCORVersion在MSCorEE.dll)存在下將被檢查僅當應用程序試圖加載DLL並分別調用函數時。如果缺少DLL,或者因爲只有一個較舊的版本而缺少某個函數,則在應用程序不使用此功能的情況下不會有任何問題。相反,如果DLL是靜態鏈接的,並且它丟失,那麼應用程序根本無法啓動(您將收到錯誤消息)。

例如:我們有一個複雜的工業測量軟件,它動態鏈接wpcap.dll。在測量不包括數據包嗅探的情況下,我們不必安裝WinPcap。

0

的一個原因,用於加載模塊及應用GetProcAddress的是,該DLL可以不存在在計算機上。這樣,即使DLL不在那裏,應用程序也可以運行。您當然需要驗證LoadLibrary和GetProcAddress都成功。

相關問題