關於VS的延遲加載dll的使用和理解

延遲加載dll:
當一個應用程序過多加載dll的時候,如果都是在啓動時加載,那麼無疑會減慢程序啓動速度,而且會讓初始的程序就佔用很大內存

空間,但並不是所有的dll都是經常使用的,有些可能僅在特殊情況下才會使用到,比如你需要打印功能時,額外的一個dll用於負責

此事,但這項功能可能很少人使用,如果程序一啓動就加載會有些浪費,謂詞微軟提供了延遲載入dll的功能,就是當你執行到某個

函數的時候,如果是首次執行,那麼可以在用到時加載該dll,甚至可以在用完再重新釋放卸載掉該dll。方法比較簡單,只需要以下

幾個步驟即可:
1:必須和原來加載dll一樣在input中放入相關的lib文件用於程序鏈接的時候能找到。否則編譯不過
2:在linker-》input裏的Delay loaded Dlls中寫入相關的需要延遲載入的dll名稱,注意,這裏不是寫入lib文件,而是寫入dll文

件全名。他的作用是
 1)告訴編譯器將該dll文件從可執行模塊的導入段中去除,這樣初始化的時候就不會加載該dll了,
 2)在可執行模塊嵌入一個新的延遲載入段(即Delay import section稱爲.didata)來表示要從mydll。dll中導入哪些函數 
 3)通過讓延遲載入函數的調用跳轉到__delayLoadHelper2函數,來完成對延遲載入函數的解析。
3:在linker-》advanced裏面打開“delay Loaded Dll”裏打開unload開關,使他support Unload。這樣就支持使用後即可通過

__FUnloadDelayLoadedDLL2來調用卸載。

通過延遲載入後,相關的函數會被重置,如果我們不用__FUnloadDelayLoadedDLL2來卸載,而直接用FreeLibrary卸載的話,由於相

關函數沒有被重置,這樣當我們下一次試圖調用dll的函數時,就會引發訪問違規。
在調用__FUnloadDelayLoadedDLL2時,需要注意,我們傳入的dll名字無路徑,且大小必須和傳入給/DelayLoad鏈接器開關的dll名字

大小寫完全相同,否則無效。如果調用了卸載函數,而沒有打開鏈接器的unload開關,則函數調用沒任何效果。

延遲載入的另一個特性就是我們調用的函數會被綁定到進程地址空間中的一個內存地址上,這個地址是系統認爲該函數應該在的位置

發佈了15 篇原創文章 · 獲贊 7 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章