共用方式為


LoadLibraryA 函式 (libloaderapi.h)

將指定的模組載入呼叫進程的位址空間。 指定的模組可能會導致其他模組載入。

如需其他載入選項,請使用 LoadLibraryEx 函式。

語法

HMODULE LoadLibraryA(
  [in] LPCSTR lpLibFileName
);

參數

[in] lpLibFileName

模組的名稱。 這可以是程式庫模組 (.dll 檔案) 或可執行檔模組 (.exe 檔案) 。 如果指定的模組是可執行檔模組,則不會載入靜態匯入;而是使用 旗標載入 LoadLibraryExDONT_RESOLVE_DLL_REFERENCES ,就像是載入模組一樣。

指定的名稱是模組的檔案名,與儲存在程式庫模組本身的名稱無關,如 module-definition (.def) 檔案中的 LIBRARY 關鍵字所指定。

如果字串指定完整路徑,函式只會搜尋模組的路徑。

如果字串指定相對路徑或沒有路徑的模組名稱,則函式會使用標準搜尋策略來尋找模組;如需詳細資訊,請參閱。

如果函式找不到模組,函式就會失敗。 指定路徑時,請務必使用反斜線 (\) ,而不是正斜線 (/) 。 如需路徑的詳細資訊,請參閱 命名檔案或目錄

如果字串指定沒有路徑且副檔名為省略的模組名稱,則函式會將預設程式庫副檔名 「.DLL」 附加至模組名稱。 若要防止函式將 「.DLL」 附加至模組名稱,請在模組名稱字串中包含尾端點字元 (.) 。

傳回值

如果函式成功,則傳回值是模組的控制碼。

如果函式失敗,則傳回值為 Null。 若要取得擴充的錯誤資訊,請呼叫 GetLastError

備註

若要在 DLL 載入期間啟用或停用載入器所顯示的錯誤訊息,請使用 SetErrorMode 函式

LoadLibrary 可用來將程式庫模組載入進程的位址空間,並傳回可在 GetProcAddress 中使用的控制碼,以取得 DLL 函式的位址。 LoadLibrary 也可以用來載入其他可執行模組。 例如,函式可以指定 .exe 檔案,以取得可在 FindResourceLoadResource中使用的控制碼。 不過,請勿使用 LoadLibrary 來執行 .exe 檔案。 請改用 CreateProcess 函式。

如果指定的模組是尚未針對呼叫進程載入的 DLL,系統會使用DLL_PROCESS_ATTACH值呼叫 DLL 的DllMain函式。 如果 DllMain 傳回 TRUELoadLibrary 會傳回模組的控制碼。 如果 DllMain 傳回 FALSE,系統會從進程位址空間卸載 DLL, 而 LoadLibrary 會傳回 Null。 從DllMain呼叫LoadLibrary並不安全。 如需詳細資訊,請參閱 DllMain中的一節。

模組控制碼不是全域或可繼承的。 一個進程的 LoadLibrary 呼叫不會產生另一個進程可以使用的控制碼,例如呼叫 GetProcAddress。 另一個進程必須在呼叫GetProcAddress之前,先對模組進行自己的LoadLibrary呼叫。

如果 lpFileName 不包含路徑,而且有多個載入的模組具有相同基底名稱和延伸模組,則函式會傳回第一次載入的模組控制碼。

如果未在 lpFileName 參數中指定副檔名,則會附加預設程式庫副檔名 .dll。 不過,檔案名字串可以包含尾端點字元 (.) ,表示模組名稱沒有副檔名。 未指定路徑時,函式會搜尋已載入的模組,其基底名稱符合要載入的模組基底名稱。 如果名稱相符,則載入會成功。 否則,函式會搜尋檔案。

第一個搜尋的目錄是包含用來建立呼叫程式 (映射檔的目錄,如需詳細資訊,請參閱 CreateProcess 函式) 。 這樣做可讓私人動態連結程式庫 (DLL) 與進程相關聯的檔案,而不需將進程的已安裝目錄新增至 PATH 環境變數。 如果指定相對路徑,則會將整個相對路徑附加至 DLL 搜尋路徑清單中的每個權杖。 若要從相對路徑載入模組而不搜尋任何其他路徑,請使用 GetFullPathName 來取得非關聯路徑,並使用非關聯路徑呼叫 LoadLibrary 。 如需 DLL 搜尋順序的詳細資訊,請參閱 動態連結程式庫搜尋順序

您可以使用 SetDllDirectory 函式來改變搜尋路徑。 建議使用此解決方案,而不是使用 SetCurrentDirectory 或硬式編碼 DLL 的完整路徑。

如果指定路徑,而且應用程式有重新導向檔案,則函式會在應用程式的目錄中搜尋模組。 如果模組存在於應用程式的目錄中, LoadLibrary 會忽略指定的路徑,並從應用程式的目錄載入模組。 如果模組不存在於應用程式的目錄中, LoadLibrary 會從指定的目錄載入模組。 如需詳細資訊,請參閱 動態連結程式庫重新導向

如果您使用沒有路徑規格的元件名稱呼叫 LoadLibrary ,而且元件列在系統相容資訊清單中,則呼叫會自動重新導向至並存元件。

系統會在所有載入的模組上維護每個進程參考計數。 呼叫 LoadLibrary 會遞增參考計數。 呼叫 FreeLibraryFreeLibraryAndExitThread 函式會遞減參考計數。 當模組的參考計數達到零或進程終止 (時,不論參考計數) 為何,系統就會卸載模組。

Windows Server 2003 和 Windows XP: Visual C++ 編譯器支援可讓您宣告執行緒區域變數的語法: _declspec (執行緒) 。 如果您在 DLL 中使用此語法,您將無法在 Windows Vista 之前的 Windows 版本上明確地使用 LoadLibrary 載入 DLL。 如果您的 DLL 會明確載入,您必須使用執行緒本機儲存體函式,而不是 _declspec (執行緒) 。 如需範例,請參閱 在動態連結程式庫中使用執行緒本機儲存體

安全性備註

請勿使用 SearchPath 函數來擷取後續 LoadLibrary 呼叫之 DLL 的路徑。 SearchPath函式會使用與LoadLibrary不同的搜尋順序,而且它不會使用安全進程搜尋模式,除非藉由使用BASE_SEARCH_PATH_ENABLE_SAFE_SEARCHMODE呼叫SetSearchPathMode來明確啟用。 因此, SearchPath 可能會先搜尋使用者目前的工作目錄,以尋找指定的 DLL。 如果攻擊者已將惡意版本的 DLL 複製到目前的工作目錄中, SearchPath 所擷取的路徑會指向惡意 DLL,然後 載入 LoadLibrary

請勿根據搜尋 DLL 的 LoadLibrary 呼叫來假設作業系統版本。 如果應用程式是在 DLL 合法不存在的環境中執行,但 DLL 的惡意版本位於搜尋路徑中,可能會載入 DLL 的惡意版本。 請改用 取得系統版本中所述的建議技術。

範例

如需範例,請參閱 使用動態連結 Run-Time

注意

libloaderapi.h 標頭會將 LoadLibrary 定義為別名,根據 UNICODE 預處理器常數的定義,自動選取此函式的 ANSI 或 Unicode 版本。 混合使用編碼中性別名與非編碼中性的程式碼,可能會導致編譯或執行時間錯誤不符。 如需詳細資訊,請參閱 函式原型的慣例

需求

   
最低支援的用戶端 Windows XP [僅限傳統型應用程式]
最低支援的伺服器 Windows Server 2003 [僅限傳統型應用程式]
目標平台 Windows
標頭 libloaderapi.h (包含 Windows.h)
程式庫 Kernel32.lib
DLL Kernel32.dll

另請參閱

DllMain

動態連結程式庫函式

FindResource

FreeLibrary

GetProcAddress

GetSystemDirectory

GetWindowsDirectory

LoadLibraryEx

LoadResource

執行時間動態連結

SetDllDirectory

SetErrorMode