zoukankan      html  css  js  c++  java
  • 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"); 
        
    }
    复制代码
  • 相关阅读:
    聊聊MySQL的索引吧
    污力满满的技术解读,瞬间印象深刻
    lua语言(1):安装、基本结构、函数、输入输出
    pandas中的那些让人有点懵逼的异常(坑向)
    与分布式相关的面试题
    图解IP基础知识
    Date类
    String 与StringBuffer习题
    Java的常用类 String
    线程练习题
  • 原文地址:https://www.cnblogs.com/lizhigang/p/7168580.html
Copyright © 2011-2022 走看看