Run-Time動態連結

當應用程式呼叫 LoadLibrary 或LoadLibraryEx 函式時,系統會嘗試尋找 DLL (以取得詳細資料,請參閱 動態連結程式庫搜尋順序) 。 如果搜尋成功,系統會將 DLL 模組對應至進程的虛擬位址空間,並遞增參考計數。 如果對 LoadLibraryLoadLibraryEx 的呼叫指定 DLL,其程式碼已經對應到呼叫程式的虛擬位址空間,則函式只會傳回 DLL 的控制碼,並遞增 DLL 參考計數。 請注意,兩個 DLL 具有相同的基底檔案名和副檔名,但在不同的目錄中找不到,不會被視為相同的 DLL。

系統會在呼叫 LoadLibraryLoadLibraryEx的執行緒內容中呼叫進入點函式。 如果進程已透過 對 LoadLibraryLoadLibraryEx 的呼叫載入 DLL,且沒有對應呼叫 FreeLibrary 函式,則不會呼叫進入點函式。

如果系統找不到 DLL,或進入點函式傳回 FALSE, LoadLibraryLoadLibraryEx 會傳回 Null。 如果 LoadLibraryLoadLibraryEx 成功,它會傳回 DLL 模組的控制碼。 此程式可以使用這個控制碼來識別GetProcAddressFreeLibrary 或 FreeLibraryAndExitThread函式呼叫中的 DLL。

GetModuleHandle函式會傳回GetProcAddressFreeLibrary 或 FreeLibraryAndExitThread中使用的控制碼。 只有在 DLL 模組已經透過載入時間連結或先前呼叫LoadLibraryEx,將進程位址空間對應到進程時,GetModuleHandle函式才會成功。 不同于 LoadLibraryLoadLibraryExGetModuleHandle 不會遞增模組參考計數。 GetModuleFileName函式會擷取與GetModuleHandleLoadLibrary 或 LoadLibraryEx所傳回之控制碼相關聯的模組完整路徑。

此程式可以使用 GetProcAddress ,透過 LoadLibraryLoadLibraryExGetModuleHandle所傳回的 DLL 模組控制碼,取得 DLL 中匯出函式的位址。

不再需要 DLL 模組時,程式可以呼叫FreeLibrary 或 FreeLibraryAndExitThread 如果參考計數為零,這些函式會遞減模組參考計數,並從進程的虛擬位址空間取消對應 DLL 程式碼。

執行時間動態連結可讓進程繼續執行,即使 DLL 無法使用也一樣。 程式接著可以使用替代方法來完成其目標。 例如,如果進程找不到一個 DLL,它可以嘗試使用另一個 DLL,或者它可以通知使用者發生錯誤。 如果使用者可以提供遺漏 DLL 的完整路徑,程式可以使用此資訊來載入 DLL,即使它不在一般搜尋路徑中也一樣。 這種情況與載入時間連結相反,如果找不到 DLL,系統只會終止進程。

執行時間動態連結如果 DLL 使用 DllMain 函式對進程的每個執行緒執行初始化,可能會導致問題,因為呼叫 LoadLibraryLoadLibraryEx 之前不存在的執行緒不會呼叫進入點。 如需示範如何處理此問題的範例,請參閱 在Dynamic-Link程式庫中使用執行緒本機儲存體

使用執行時間動態連結