windows 下进程与线程的遍历

时间:2022-09-24 18:21:19

在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参数相同。

 

实现代码:

windows 下进程与线程的遍历windows 下进程与线程的遍历
//获取系统进程 
#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");

}
View Code