如何枚举系统当前进程


编译 浙江大学 王向伟


下载源代码

   首先, 调用 CreateToolhelp32Snapshot() 获得当前运行进程的快照,这个函数返回包含正在运行进程的快照句柄。其原形是:

HANDLE WINAPI CreateToolhelp32Snapshot(DWORD dwFlags,DWORD th32ProcessID);

其中:
dwFlags
表示要包含在快照的内容为TH32CS_SNAPPROCESS表示在快照中包含进程列表;
th32ProcessID
是进程号,为0表示当前进程。
返回值是一个句柄,如果没有进程正在运行,则返回INVALID_HANDLE_VALUE(可用GetLastError()获得),反之可用BOOL WINAPI Process32First(HANDLE hSnapshot, LPPROCESSENTRY32 lppe);获取返回的进程
如果Process32First返回TRUE,则第一个进程的信息已经在LPPROCESSENTRY32结构中,其余进程信息可用BOOL WINAPI Process32Next(HANDLE hSnapshot, LPPROCESSENTRY32 lppe)获得
LPPROCESSENTRY32
结构的定义如下:

typedef struct tagPROCESSENTRY32 {

  DWORD dwSize; //此结构的大小

  DWORD cntUsage; //进程的引用数,如果为0,则次进程已停止

  DWORD th32ProcessID; //进程号

  ULONG_PTR th32DefaultHeapID;

  DWORD th32ModuleID; //此进程引用的模块ID

  DWORD cntThreads; //此进程创建的线程数

  DWORD th32ParentProcessID; //父进程的ID

  LONG  pcPriClassBase; //这个进程创建的线程的基本优先权

  DWORD dwFlags; //保留

  TCHAR szExeFile[MAX_PATH];

} PROCESSENTRY32;

typedef PROCESSENTRY32 *PPROCESSENTRY32;      

最后不要忘了调用:

 CloseHandle();     

另用函数是:

HANDLE OpenProcess(

  DWORD dwDesiredAccess,  // access flag

  BOOL bInheritHandle,    // handle inheritance option

  DWORD dwProcessId       // process identifier

);    

用它可打开一个进程,打开进程后,可用:

BOOL TerminateProcess(

  HANDLE hProcess, // handle to the process

  UINT uExitCode   // exit code for the process

);     

来关闭进程。
   
笔者用上述函数做了一个类似任务管理器的进程管理器可以枚举所有进程、关闭进程。细节请参见源代码。