zoukankan      html  css  js  c++  java
  • windows-进程相关操作

    进程相关操作

    函数功能
    CreateProcess 创建进程
    OpenProcess 打开进程
    ExitProcess 退出本进程
    TerminateProcess 结束指定进程
    WinExec 启动一个进程
    ShellExecute 运行一个外部程序,或者打开一个文件目录,文件夹等等
    system 控制台命令
    CreateToolhelp32Snapshot 创建快照遍历进程、线程、模块、堆

    打开一个进程(其实也就是获得进程句柄

    函数原型

    HANDLE OpenProcess(
    DWORD dwDesiredAccess,
    BOOL bInheritHandle,
    DWORD dwProcessId
    );

    参数

    第一个参数dwDesiredAccess表示打开的进程的权限,来描述打开这个进程的句柄获得的权限有哪些

    PROCESS_ALL_ACCESS 这个宏表示获得所有的权限

     

    第二个参数 bInheritHandle表示如果用这个句柄创建的进程是否继承该句柄,在这里我们拿来也没啥用直接用NULL就好

    第三个参数表示要打开的进程的ID

    void Open_Process(int pid)
    {
    OpenProcess(PROCESS_ALL_ACCESS, NULL, pid);
    }

    返回值

    如果打开成功会返回对于的进程句柄,如果失败则返回NULL

    关闭指定进程

    函数原型

    BOOL TerminateProcess(
    HANDLE hProcess,
    UINT   uExitCode
    );

    参数

    第一个参数表示进程句柄

    第二个参数表示的是退出进程传递的代码值,这个基本上是写操作系统时的进程退出的原因才用的上,这里直接传0就好

    void Close_Process(HANDLE hProcess)
    {
    TerminateProcess(hProcess, 0);
    }

    遍历进程

    函数原型

    HANDLE CreateToolhelp32Snapshot(
    DWORD dwFlags,
    DWORD th32ProcessID
    );

    这个函数是包括在tlhelp32.h头文件下的,需要添加使用

    参数

    第一个参数 dwFlags表示需要遍历什么东西。因为它可以遍历进程线程模块和堆这四种东西。

    TH32CS_SNAPPROCESS 这个宏表示的是遍历系统中的所有进程

    第二个参数 表示的是进程的ID,但是这个第二个参数只有在遍历线程,模块和堆的情况下需要,因为线程模块和堆都是进程里面包含的,因为这里我们是需要的是遍历进程,所以直接传0

    返回值

    如果函数成功,返回打开的句柄到指定的快照,如果失败则返回INVALID_HANDLE_VALUE

    枚举进程

    在CreateToolhelp32Snapshot函数中的第一个参数的宏中提示了枚举进程的办法,使用Process32First函数,然后在Process32First中有Process32Next函数来访问快照中的下一个进程,相当于就是说访问第一个,然后一直下一个下一个

    函数原型

    BOOL Process32First(
    HANDLE           hSnapshot,
    LPPROCESSENTRY32 lppe
    );
    BOOL Process32Next(
    HANDLE           hSnapshot,
    LPPROCESSENTRY32 lppe
    );

    参数

    这两个函数的参数都一样,第一个参数是快照的句柄,第二个参数是一个结构体的指针,在windows编程下的p也就是point是指针的意思,l就是long的意思。第二个参数是一个用来描述快照中的进程信息的一个结构体的指针

    LPPROCESSENTRY32
    typedef struct tagPROCESSENTRY32 {
    DWORD     dwSize;
    DWORD     cntUsage;
    DWORD     th32ProcessID;
    ULONG_PTR th32DefaultHeapID;
    DWORD     th32ModuleID;
    DWORD     cntThreads;
    DWORD     th32ParentProcessID;
    LONG     pcPriClassBase;
    DWORD     dwFlags;
    CHAR     szExeFile[MAX_PATH];
    } PROCESSENTRY32;

    该结构体是用来描述快照中的进程的信息的,在创建结构体的时候需要初始化dwSize,不然就创建失败,后面的参数不用管,这里就相当于创建了一个描述进程信息的结构体来获取进程信息,不用赋值因为反正后面都会被获得的进程的信息覆盖

    返回值

    如果成功的话会返回一个Bool类型

    遍历系统进程的完整代码

    void Ergodic_Process()
    {
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    PROCESSENTRY32 processEntry;
    processEntry.dwSize = sizeof(PROCESSENTRY32);
    BOOL fSuccess = Process32First(hSnapshot, &processEntry);
    if (fSuccess)
    {
    //表示如果成功获取到了快照中的第一个进程
    do
    {
    printf("进程id=%d,进程名字=%ls ", processEntry.th32ProcessID, processEntry.szExeFile);
    } while (Process32Next(hSnapshot, &processEntry));
    }
    }

    但是这个不支持中文,以下是修正版

    void Ergodic_Process()
    {
    setlocale(LC_ALL, "chs");
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    PROCESSENTRY32 processEntry;
    processEntry.dwSize = sizeof(PROCESSENTRY32);
    BOOL fSuccess = Process32First(hSnapshot, &processEntry);
    if (fSuccess)
    {
    //表示如果成功获取到了快照中的第一个进程
    do
    {
    printf("进程id=%d,进程名字=%ls ", processEntry.th32ProcessID, processEntry.szExeFile);
    } while (Process32Next(hSnapshot, &processEntry));
    }
    }

     

  • 相关阅读:
    Minimum Depth of Binary Tree leetcode java
    Maximum Depth of Binary Tree leetcode java
    Symmetric Tree leetcode java
    Same Tree leetcode java
    Binary Tree Postorder Traversal leetcode java
    Binary Tree Preorder Traversal leetcode java
    Binary Tree Inorder Traversal leetcode java
    Combinations leetcode java
    一键清除Centos iptables 防火墙所有规则
    阿里云centos7.7x64安装open,并配置ip转发和nat伪装
  • 原文地址:https://www.cnblogs.com/beautiful7/p/14264627.html
Copyright © 2011-2022 走看看