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

2021-06-02 19:44:24 字數 1127 閱讀 6611

延遲載入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開關,則函式呼叫沒任何效果。

延遲載入的另乙個特性就是我們呼叫的函式會被繫結到程序位址空間中的乙個記憶體位址上,這個位址是系統認為該函式應該在的位置

關於延遲載入lazy的小結

lazy用於配置檢索策略,也就是是否使用延遲 1class 標籤中出現lazy,主要針對於類級別操作 假設都使用load方法。true 使用延遲載入 false 禁止使用延遲載入,即使是使用load方法 2set中出現lazy,主要針對一對多和多對多時候類關聯級別的檢索策略 true 表示載入one...

延遲的載入

get和load乙個實體時,get會立即返回實體,而load返回的是乙個 只有你訪問了該實體的屬性,才會真正從資料庫裡讀取,這個你可以看他有沒有發出sql語句就可以證明。另乙個就是對映關係時,比如一對多,一這裡定義了乙個多的一方的集合,延遲的載入的話就不會載入關聯的實體 延遲載入分類 01.類級別的...

關於DLL路徑載入順序的問題

預設系統xp,安全搜尋模式 hklm system currentcontrolset control session manager safedllsearchmode值為0時為非安全,其餘情況為安全,xp後系統支援 一 標準的dll路徑載入 例如隱式載入,或者如下的顯示載入 loadlibrar...