zoukankan      html  css  js  c++  java
  • Win32进程创建、进程快照、进程终止用例

    进程创建:
    1
    #include <windows.h> 2 #include <stdio.h> 3 4 int main() 5 { 6 // 创建打开系统自带记事本进程 7 STARTUPINFO si1 = {sizeof(si1)}; 8 PROCESS_INFORMATION pi1; 9 char * szCmdLine1 = "notepad"; 10 if(::CreateProcess(NULL, szCmdLine1, NULL, NULL, FALSE, NULL, NULL, NULL, &si1, &pi1)) 11 printf("Create notepad process successfully! "); 12 13 14 // 新建一个cmd进程窗口 15 char* szCmdLine2 = "cmd"; 16 STARTUPINFO si2 = {sizeof(si2)}; 17 PROCESS_INFORMATION pi2; 18 si2.dwFlags = STARTF_USESHOWWINDOW; // 指定wShowWindow成员有效 19 si2.wShowWindow = TRUE; // 此成员设为TRUE的话则显示新建进程的主窗口,FALSE不显示 20 21 BOOL bRet = ::CreateProcess( 22 NULL, // 不在此指定可执行文件的文件名 23 szCmdLine2, // 命令行参数 24 NULL, // 默认进程安全性 25 NULL, // 默认线程安全性 26 FALSE, // 指定当前进程内的句柄不可以被子进程继承 27 CREATE_NEW_CONSOLE, // 为新进程创建一个新的控制台窗口,如果为NULL,不会创建新的窗口 28 NULL, // 使用本进程的环境变量 29 NULL, // 使用本进程的驱动器和目录 30 &si1, 31 &pi2); 32 33 if (bRet) 34 { 35 // 既然不使用两个句柄,最好是立刻将它们关闭 36 ::CloseHandle(pi2.hThread); 37 ::CloseHandle(pi2.hProcess); 38 printf("新进程的进程ID号:%d ", pi2.dwProcessId); 39 printf("新进程的主线程ID号:%d ", pi2.dwThreadId); 40 } 41 42 return 0; 43 }

    运行效果:

     进程快照
    1
    #include <windows.h> 2 #include <TLHELP32.H> // 声明快照函数的头文件 3 #include <stdio.h> 4 5 int main() 6 { 7 PROCESSENTRY32 pe32; 8 pe32.dwSize = sizeof(pe32); 9 10 // 给系统内的所有进程拍一个快照--改函数用于获取系统指定进程的快照,也可以传入不同参数获取被这些进程使用的堆、模块和线程的快照 11 HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 12 if (hProcessSnap == INVALID_HANDLE_VALUE) 13 { 14 printf("CreateToolhelp32Snapshot 调用失败! "); 15 return -1; 16 } 17 18 // 遍历进程快照,轮流显示每个进程的信息 19 BOOL bMore = ::Process32First(hProcessSnap, &pe32); 20 while(bMore) 21 { 22 printf("进程名称:%s ", pe32.szExeFile); 23 printf("进程ID号:%u ", pe32.th32ProcessID); 24 bMore = ::Process32Next(hProcessSnap, &pe32); 25 } 26 27 // 不要忘记清除掉snapshot 对象 28 ::CloseHandle(hProcessSnap); 29 return 0; 30 }

    注释:
    CreateToolhelp32Snapshot 用于获取系统内指定进程的快照,也可以获取被这些进程使用的堆、模块和线程的快照。函数的具体用法是。
    HANDLE WINAPI CreateToolhelp32Snapshot(
    DWORD dwFlags, // 用来指定“快照”中需要返回的对象,可以是TH32CS_SNAPPROCESS等
    DWORD th32ProcessID // 一个进程ID号,用来指定要获取哪一个进程的快照,当获取系统进程列表或获取当前进程快照时可以设为0
    );
    本函数不仅可以获取进程列表,也可以用来获取线程和模块等对象的列表。dwFlags 参数指定了获取的列表的类型,其值可以是:
    TH32CS_SNAPHEAPLIST 枚举 th32ProcessID 参数指定的进程中的堆。
    TH32CS_SNAPMODULE 枚举 th32ProcessID 参数指定的进程中的模块。
    TH32CS_SNAPPROCESS 枚举系统范围内的进程,此时 th32ProcessID 参数被忽略。
    TH32CS_SNAPTHREAD 枚举系统范围内的线程,此时 th32ProcessID 参数被忽略。
    函数执行成功将返回一个快照句柄,否则返回 INVALID_HANDLE_VALUE(即-1) 。
    从快照列表中获取进程信息需要使用 Process32First 和 Process32Next 函数, 函数的每次调用仅返回一个进程的信息。Process32First 函数用来进行首次调用,以后的调用由
    Process32Next 函数循环完成,直到所有的信息都被获取为止。当不再有剩余信息的时候,函数返回 FALSE,所以程序中使用下面的循环结构来获取进程列表。
    BOOL bMore = ::Process32First(hProcessSnap, &pe32);
    while(bMore)
    { // 在这里处理返回到 PROCESSENTRY32 中的进程信息
    bMore = ::Process32Next(hProcessSnap, &pe32);
    }

    运行效果:

    终止进程:

    终止进程也就是结束程序的执行,让它从内存中卸载。进程终止的原因可能有 4 种:
    (1)主线程的入口函数返回。
    (2)进程中一个线程调用了 ExitProcess 函数,该函数只能终止当前进程。
    (3)此进程中的所有线程都结束了。
    (4)其他进程中的一个线程调用了 TerminateProcess 函数。

    终止当前进程:
    void ExitProcess(UINT uExitCode); // 参数uExitCode 为此程序的退出代码。
    
    终止其他进程:
    BOOL TerminateProcess(
        HANDLE hProcess, // 要结束的进程(目标进程)的句柄
        UINT uExitCode  // 指定目标进程的退出代码,你可以使用GetExitCodeProcess 取得一个进程的退出代码
    );

      在对一个进程操作前, 必须首先取得该进程的进程句柄。 CreateProcess 函数创建进程后会返回一个进程句柄,而对于一个已经存在的进程,只能使用 OpenProcess 函数来取得这个进程
    的访问权限,函数用法如下:

     HANDLE OpenProcess(
        DWORD dwDesiredAccess, // 想得到的访问权限,可以是PROCESS_ALL_ACCESS等
        BOOL bInheritHandle,   // 指定返回的句柄是否可以被继承
        DWORD dwProcessId      // 指定要打开的进程的ID 号
      );

     一般使用下面的代码来终止一个进程:
     BOOL TerminateProcessFromId(DWORD dwId)
     {
        BOOL bRet = FALSE;
       // 打开目标进程,取得进程句柄
       HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwId);
       if(hProcess != NULL)
       { // 终止进程

        bRet = ::TerminateProcess(hProcess, 0);
       }
       CloseHandle(hProcess);
       return bRet;
    }

  • 相关阅读:
    hdu 1269 迷宫城堡 (并查集)
    hdu 1272 小希的迷宫 (深搜)
    hdu 1026 Ignatius and the Princess I (深搜)
    hdu 1099 Lottery
    hdu 1068 Girls and Boys (二分匹配)
    几个基础数位DP(hdu 2089,hdu 3555,uestc 1307 windy 数)
    hdu 1072 Nightmare (广搜)
    hdu 1398 Square Coins (母函数)
    hdu 1253 胜利大逃亡 (深搜)
    hdu 1115 Lifting the Stone (求重心)
  • 原文地址:https://www.cnblogs.com/dongsheng/p/4192228.html
Copyright © 2011-2022 走看看