若要控制 64 位應用程式是否列舉 32 位模組、64 位模組或兩種類型的模組,請使用
EnumProcessModulesEx
函式。
BOOL EnumProcessModules(
[in] HANDLE hProcess,
[out] HMODULE *lphModule,
[in] DWORD cb,
[out] LPDWORD lpcbNeeded
[in] hProcess
進程的句柄。
[out] lphModule
接收模組句柄清單的陣列。
[in] cb
lphModule 陣列的大小,以位元組為單位。
[out] lpcbNeeded
在 lphModule 陣列中儲存所有模組句柄所需的位元組數目。
如果函式成功,則傳回非零的值。
如果此函式失敗,則傳回值為零。 若要取得擴充的錯誤資訊,請呼叫 GetLastError。
EnumProcessModules 函式主要是設計供調試程式和類似應用程式使用,這些應用程式必須從另一個進程擷取模組資訊。
如果目標進程中的模組清單已損毀或尚未初始化,或模組清單在函式呼叫期間因載入或卸除 DLL 而變更, EnumProcessModules 可能會失敗或傳回不正確的資訊。
建議您指定大型 HMODULE 值數位,因為很難預測在呼叫 EnumProcessModules 時,程式中會有多少模組。 若要判斷 lphModule 陣列是否太小而無法保存進程的所有模組句柄,請比較 lcbNeeded 中傳回的值與 cb 中指定的值。
如果 lcbNeeded 大於 cb,請增加數位的大小,然後再次呼叫 EnumProcessModules 。
若要判斷對 EnumProcessModules 的呼叫列舉了多少個模組,請將 lNeed 參數中產生的值除以 sizeof(HMODULE)
。
EnumProcessModules 函式不會擷取以LOAD_LIBRARY_AS_DATAFILE或類似旗標載入之模組的句柄。
如需詳細資訊,請參閱 LoadLibraryEx。
請勿在此函式傳回的任何句柄上呼叫 CloseHandle 。 此資訊來自快照集,因此不會釋放任何資源。
如果從 WOW64 上執行的 32 位應用程式呼叫此函式,它只能列舉 32 位進程的模組。 如果進程是64位進程,則此函式會失敗,而且最後一個錯誤碼 會ERROR_PARTIAL_COPY ( 299) 。
若要擷取指定進程和這些進程所使用的堆積、模組和線程快照集,請使用 CreateToolhelp32Snapshot 函式。
從 Windows 7 和 Windows Server 2008 R2 開始,Psapi.h 會建立 PSAPI 函式的版本號碼。 PSAPI 版本號碼會影響用來呼叫函式的名稱,以及程式必須載入的連結庫。
如果 PSAPI_VERSION 為 2 或更新版本,此函式會定義為 Psapi.h 中的 K32EnumProcessModules,並在 Kernel32.lib 和 Kernel32.dll 中導出。 如果 PSAPI_VERSION 為 1,此函式會定義為 Psapi.h 中的 EnumProcessModules, 並在 Psapi.lib 中導出,並 Psapi.dll 為呼叫 K32EnumProcessModules 的包裝函式。
必須在舊版 Windows 和 Windows 7 和更新版本上執行的程式應該一律將此函式呼叫為 EnumProcessModules。 若要確保符號的正確解析,請將 Psapi.lib 新增至 TARGETLIBS 宏,並使用 -DPSAPI_VERSION=1 編譯程式。 若要使用運行時間動態連結,請載入 Psapi.dll。
如需範例,請參閱 列舉所有進程 或 列舉進程的所有模組。