windows 下进程与线程的遍历
在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"); }