Process32FirstW 基本概念 Process32FirstW是Windows系统Tool Help Library(工具帮助库)中用于枚举进程信息的宽字符(Unicode)版本起始函数(Process32First是ANSI版本)。它的核心作用是从通过CreateToolhelp32Snapshot创建的 “进程快照” 中,提取第一个进程 的详细信息(如进程 ID、父进程 ID、可执行文件路径等),是遍历系统所有进程的 “起点”,通常与Process32NextW配合使用以完成全部进程的枚举。
基本语法 1 2 3 4 5 6 7 8 9 BOOL Process32FirstW ( [in] HANDLE hSnapshot, [in, out] LPPROCESSENTRY32W lppe ) ; BOOL Process32First ( [in] HANDLE hSnapshot, [in, out] LPPROCESSENTRY32 lppe ) ;
LPPROCESSENTRY32W
1 2 3 4 5 6 7 8 9 10 11 12 typedef struct tagPROCESSENTRY32W { DWORD dwSize; DWORD cntUsage; DWORD th32ProcessID; ULONG_PTR th32DefaultHeapID; DWORD th32ModuleID; DWORD cntThreads; DWORD th32ParentProcessID; LONG pcPriClassBase; DWORD dwFlags; WCHAR szExeFile[MAX_PATH]; } PROCESSENTRY32W, *PPROCESSENTRY32W;
返回值 成功:返回TRUE,此lppe结构体已填充第一个进程的详细信息。 失败:返回FALSE,可通过GetLastError()查看具体错误原因。
Process32NextW 基本概念 Process32NextW是Windows系统Tool Help Library中用于 枚举进程信息的宽字符(Unicode)版本后续函数(Process32Next是ANSI版本)。它与Process32FirstW配合使用,在获取第一个进程信息后,依次提取进程快照中后续所有进程 的详细数据,直至完成系统中所有进程的遍历。
基本语法 1 2 3 4 5 6 7 8 9 BOOL Process32NextW ( [in] HANDLE hSnapshot, [out] LPPROCESSENTRY32W lppe ) ;BOOL Process32Next ( [in] HANDLE hSnapshot, [out] LPPROCESSENTRY32 lppe ) ;
返回值 成功:返回TRUE,lppe结构体中已填充下一个进程的信息。 失败:返回FALSE,通过GetLastError()判断原因: 若返回ERROR_NO_MORE_FILES:表示所有进程已枚举完毕(正常结束)。 其他错误码(如ERROR_INVALID_PARAMETER、ERROR_ACCESS_DENIED):表示参数无效、权限不足或快照句柄错误。
简单示例 枚举所有进程,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 #include <windows.h> #include <tlhelp32.h> #include <stdio.h> int main () { HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0 ); if (hSnapshot == INVALID_HANDLE_VALUE) { printf ("创建快照失败!错误码:%lu\n" , GetLastError()); return 1 ; } PROCESSENTRY32W pe32; pe32.dwSize = sizeof (PROCESSENTRY32W); if (!Process32FirstW(hSnapshot, &pe32)) { printf ("获取第一个进程失败!错误码:%lu\n" , GetLastError()); CloseHandle(hSnapshot); return 1 ; } printf ("=== 系统进程列表(PID | 父PID | 进程名) ===\n" ); do { wprintf(L"%-6lu | %-6lu | %ls\n" , pe32.th32ProcessID, pe32.th32ParentProcessID, pe32.szExeFile); } while (Process32NextW(hSnapshot, &pe32)); DWORD lastError = GetLastError(); if (lastError != ERROR_NO_MORE_FILES) { printf ("枚举进程失败!错误码:%lu\n" , lastError); } CloseHandle(hSnapshot); return 0 ; }