windows 下进程与线程的遍历

原文:http://www.cnblogs.com/Apersia/p/6579376.html

在Windows下进程与线程的遍历有好几种方法。

进程与线程的遍历可以使用<TlHelp.h>提供的几个函数来完成。

CreateToolHelp32Snapshot():

作用:为指定的进程,当然还有进程下的堆,模块和线程拍一个快照。

函数原型:

HANDLE WINAPI CreateToolhelp32Snapshot(
    _In_ DWORD dwFlags,
    _In_ DWORD th32ProcessID
);

参数:

dwFlags:

 取决于你想拍什么快照,使用的参数不同,

TH32CS_SNAPPROCESS    进程快照

TH32CS_SNAPTHREAD      线程快照

TH32CS_SNAPMODULE        模块快照

详细的参阅MSDN
 
th32ProcessID: 
快照中包含的进程标识符,获取进程使用0.
Process32First:
作用:获取进程快照的第一个。
原型:
1
2
3
4
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"); 
    
}
复制代码
原文地址:https://www.cnblogs.com/lizhigang/p/7168580.html