Run-Time動態連結
當應用程式呼叫 LoadLibrary 或LoadLibraryEx 函式時,系統會嘗試尋找 DLL (以取得詳細資料,請參閱 動態連結程式庫搜尋順序) 。 如果搜尋成功,系統會將 DLL 模組對應至進程的虛擬位址空間,並遞增參考計數。 如果對 LoadLibrary 或 LoadLibraryEx 的呼叫指定 DLL,其程式碼已經對應到呼叫程式的虛擬位址空間,則函式只會傳回 DLL 的控制碼,並遞增 DLL 參考計數。 請注意,兩個 DLL 具有相同的基底檔案名和副檔名,但在不同的目錄中找不到,不會被視為相同的 DLL。
系統會在呼叫 LoadLibrary 或 LoadLibraryEx的執行緒內容中呼叫進入點函式。 如果進程已透過 對 LoadLibrary 或 LoadLibraryEx 的呼叫載入 DLL,且沒有對應呼叫 FreeLibrary 函式,則不會呼叫進入點函式。
如果系統找不到 DLL,或進入點函式傳回 FALSE, LoadLibrary 或 LoadLibraryEx 會傳回 Null。 如果 LoadLibrary 或 LoadLibraryEx 成功,它會傳回 DLL 模組的控制碼。 此程式可以使用這個控制碼來識別GetProcAddress、FreeLibrary 或 FreeLibraryAndExitThread函式呼叫中的 DLL。
GetModuleHandle函式會傳回GetProcAddress、FreeLibrary 或 FreeLibraryAndExitThread中使用的控制碼。 只有在 DLL 模組已經透過載入時間連結或先前呼叫LoadLibraryEx,將進程位址空間對應到進程時,GetModuleHandle函式才會成功。 不同于 LoadLibrary 或 LoadLibraryEx, GetModuleHandle 不會遞增模組參考計數。 GetModuleFileName函式會擷取與GetModuleHandle、LoadLibrary 或 LoadLibraryEx所傳回之控制碼相關聯的模組完整路徑。
此程式可以使用 GetProcAddress ,透過 LoadLibrary 或 LoadLibraryEx、 GetModuleHandle所傳回的 DLL 模組控制碼,取得 DLL 中匯出函式的位址。
不再需要 DLL 模組時,程式可以呼叫FreeLibrary 或 FreeLibraryAndExitThread。 如果參考計數為零,這些函式會遞減模組參考計數,並從進程的虛擬位址空間取消對應 DLL 程式碼。
執行時間動態連結可讓進程繼續執行,即使 DLL 無法使用也一樣。 程式接著可以使用替代方法來完成其目標。 例如,如果進程找不到一個 DLL,它可以嘗試使用另一個 DLL,或者它可以通知使用者發生錯誤。 如果使用者可以提供遺漏 DLL 的完整路徑,程式可以使用此資訊來載入 DLL,即使它不在一般搜尋路徑中也一樣。 這種情況與載入時間連結相反,如果找不到 DLL,系統只會終止進程。
執行時間動態連結如果 DLL 使用 DllMain 函式對進程的每個執行緒執行初始化,可能會導致問題,因為呼叫 LoadLibrary 或 LoadLibraryEx 之前不存在的執行緒不會呼叫進入點。 如需示範如何處理此問題的範例,請參閱 在Dynamic-Link程式庫中使用執行緒本機儲存體。
相關主題