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;
    }

  • 相关阅读:
    Silverlight4实现三维企业网站
    (学)Lazarus 字符串压缩、解压缩
    (原)Oracel 函数返回 Decimal 丢失小数位问题
    (原)如何提高软件运行速度
    (转) ORA01033: ORACLE 正在初始化或关闭
    (学)正在写一个陌生行业的方案,努力ing
    (学)Telerik GridFoot 如何加合计
    (思)爱的路上千万里
    (学)Telerik RadGridView 中Column 数据字段绑定
    写在2011年伊始
  • 原文地址:https://www.cnblogs.com/dongsheng/p/4192228.html
Copyright © 2011-2022 走看看