在Windows下进程与线程的遍历有好几种方法。
进程与线程的遍历可以使用<TlHelp.h>提供的几个函数来完成。
CreateToolHelp32Snapshot():
作用:为指定的进程,当然还有进程下的堆,模块和线程拍一个快照。
函数原型:
HANDLE WINAPI CreateToolhelp32Snapshot(
_In_ DWORD dwFlags,
_In_ DWORD th32ProcessID
);
参数:
dwFlags:
取决于你想拍什么快照,使用的参数不同,
TH32CS_SNAPPROCESS 进程快照
TH32CS_SNAPTHREAD 线程快照
TH32CS_SNAPMODULE 模块快照
详细的参阅MSDN
th32ProcessID:
快照中包含的进程标识符,获取进程使用0.
Process32First:
作用:获取进程快照的第一个。
原型:
BOOL WINAPI Process32First(
_In_ HANDLE hSnapshot,
_Inout_ LPPROCESSENTRY32 lppe
);
参数:
hSnapshot:
有CreateToolhelp32Snapshot创建的快照,
lppe:
LPROCESSENTRY32的指针。
Process32Next:
作用:获取进程快照的下一个。
原型:
BOOL WINAPI Process32Next(
_In_ HANDLE hSnapshot,
_Out_ LPPROCESSENTRY32 lppe
);
参数:和Process32First参数相同。
实现代码:
//获取系统进程
#include <windows.h>
#include <TlHelp32.h>
#include <iostream>
#include <map>
#include <string>
using namespace std;
BOOL traverseProcess(std::map<std::string, int>&_nameID){
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(PROCESSENTRY32);
HANDLE hProcessSnap;
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hProcessSnap == INVALID_HANDLE_VALUE){
cout << "CreateToolhelp32Snapshot Error!" << endl;
return false;
}
if(!Process32First(hProcessSnap, &pe32)){
cout << "Process32First Error!" << endl;
CloseHandle(hProcessSnap);
return false;
}
int num = 0;
do{
string name = pe32.szExeFile;
int id = pe32.th32ProcessID;
cout << "[" << ++num << "]:" << "Process Name = " << name << "------------"
<< "Process ID = " << id << endl;
_nameID.insert(std::pair<string, int>(name, id));
}while(Process32Next(hProcessSnap, &pe32));
CloseHandle(hProcessSnap);
return true;
}
int main(){
map<string, int> _nameID;
if(!traverseProcess(_nameID)){
cout << "Start Process Error!" << endl;
}
system("pause");
}