GetModuleHandleA 函式 (libloaderapi.h)
擷取指定模組的模組句柄。 呼叫進程必須已載入模組。
若要避免一節中所述的競爭條件,請使用 GetModuleHandleEx 函式。
語法
HMODULE GetModuleHandleA(
[in, optional] LPCSTR lpModuleName
);
參數
[in, optional] lpModuleName
載入的模組名稱(.dll 或 .exe 檔案)。 如果省略擴展名,則會附加默認連結庫擴展名 .dll。 檔名字串可以包含尾端點字元 (.),表示模組名稱沒有擴展名。 字串不需要指定路徑。 指定路徑時,請務必使用反斜杠 (\),而不是正斜線 (/)。 名稱會與目前對應至呼叫進程位址空間的模組名稱進行比較(個別大小寫)。
如果此參數為 NULL,GetModuleHandle 會傳回用來建立呼叫進程之檔案的句柄(.exe 檔案)。
GetModuleHandle 函式不會擷取使用 LOAD_LIBRARY_AS_DATAFILE 旗標載入之模組的句柄。 如需詳細資訊,請參閱 LoadLibraryEx。
傳回值
如果函式成功,傳回值就是指定模組的句柄。
如果函式失敗,傳回值為NULL。 若要取得擴充的錯誤資訊,請呼叫 GetLastError。
言論
傳回的句柄不是全域或可繼承的。 它不能由另一個進程複製或使用。
如果 lpModuleName 不包含路徑,而且有多個載入的模組具有相同基底名稱和擴充功能,則您無法預測將傳回哪個模組句柄。 若要解決此問題,您可以指定路徑、使用 並存元件,或使用 GetModuleHandleEx 來指定記憶體位置,而不是 DLL 名稱。
GetModuleHandle 函式會傳回對應模組的句柄,而不會遞增其參考計數。 不過,如果這個句柄傳遞至 FreeLibrary 函式,對應的模塊參考計數將會遞減。 因此,請勿將 getModuleHandle
此函式必須在多線程應用程式中小心使用。 不保證模組句柄在函式傳回句柄和使用句柄的時間之間保持有效。 例如,假設線程擷取模組句柄,但在使用句柄之前,第二個線程會釋放模組。 如果系統載入另一個模組,它可以重複使用最近釋放的模組句柄。 因此,第一個線程的句柄會與預期的模組不同。
例子
注意
libloaderapi.h 標頭會將 GetModuleHandle 定義為別名,根據 UNICODE 預處理器常數的定義,自動選取此函式的 ANSI 或 Unicode 版本。 混合使用編碼中性別名與非編碼中性的程序代碼,可能會導致編譯或運行時間錯誤不符。 如需詳細資訊,請參閱函式原型的
要求
要求 | 價值 |
---|---|
最低支援的用戶端 | Windows XP [僅限傳統型應用程式] |
支援的最低伺服器 | Windows Server 2003 [僅限傳統型應用程式] |
目標平臺 | 窗戶 |
標頭 | libloaderapi.h (包括 Windows.h) |
連結庫 | Kernel32.lib |
DLL | Kernel32.dll |