2011-10-09 55 views
3

當我想調用一些Windows函數,如MessageBox時,我可以從user32.dll中導入它並調用(使用LoadLibrary和GetProcAddress)。但是也有一個Visual C++使用的靜態庫,所以我不需要手動加載DLL和函數。他們如何工作?它們是否包含每次調用函數時調用LoadLibrary/GetProcAddress的包裝?靜態庫

回答

6

您所指的「靜態庫」實際上是import library。這種類型的庫包含告訴鏈接器每個函數實際存在於哪個庫中的記錄,並且本身不包含任何代碼。鏈接器在可執行文件中創建導入記錄,加載程序在加載時解析該導入記錄。這將修復運行時使用的地址,因此您的代碼不需要明確地調用LoadLibraryGetProcAddress

1

不,他們只是允許你使用靜態鏈接與DLL。可執行文件包含其他DLL文件所需的函數列表,因此加載可執行文件時,加載程序將解析此列表並使用LoadLibraryGetProcAddress解析每個函數,將結果保存到靜態表(IAT,導入的地址表) 。這隻做一次。還有DLL的「延遲加載」的概念,它只會在函數第一次調用時才解析地址,但很少使用。

這樣,DLL的lib文件只包含構建該列表所需的信息(導出函數的名稱)。

+0

使用延遲加載庫的一個示例是支持多個版本的DirectX並基於客戶端計算機選擇一個的項目。它將列出所有受支持版本的DLL作爲延遲加載庫,實際上只加載一個。 – IronMensan