当前位置: 首页 > 编程笔记 >

VC下通过系统快照实现进程管理的方法

冯良才
2023-03-14
本文向大家介绍VC下通过系统快照实现进程管理的方法,包括了VC下通过系统快照实现进程管理的方法的使用技巧和注意事项,需要的朋友参考一下

本文实例讲述了VC下通过系统快照实现进程管理的方法,分享给大家供大家参考。具体实现方法如下:

一、引言

  每一个应用程序实例在运行起来后都会在当前系统下产生一个进程,大多数应用程序均拥有可视界面,用户可以通过标题栏上的关闭按钮关闭程序。但是也有为数不少的在后台运行的程序是没有可视界面的,对于这类应用程序用户只能通过CTRL+ALT+DEL热键呼出"关闭程序"对话框显示出当前系统进程列表,从中可以结束指定的任务。显然,该功能在一些系统监控类软件中还是非常必需的,其处理过程大致可以分为两步:借助系统快照实现对系统当前进程的枚举和根据枚举结果对进程进行管理。本文下面即将对此过程的实现进行介绍。

二、当前进程的枚举

  要对当前系统所有已开启的进程进行枚举,就必须首先获得那些加载到内存的进程当前相关状态信息。在Windows操作系统下,这些进程的当前状态信息不能直接从进程本身获取,系统已为所有保存在系统内存中的进程、线程以及模块等的当前状态的信息制作了一个只读副本--系统快照,用户可以通过对系统快照的访问完成对进程当前状态的检测。在具体实现时,系统快照句柄的获取是通过Win32 API函数CreateToolhelp32Snapshot()来完成的,通过该函数不仅可以获取进程快照,而且对于堆、模块和线程的系统快照同样可以获取。该函数原型声明如下:

HANDLE WINAPI CreateToolhelp32Snapshot(DWORD dwFlags,DWORD th32ProcessID);

  其中,参数dwFlags:指定将要创建包含哪一类系统信息的快照句柄,本程序中只需要检索系统进程信息,因此可将其设置为 TH32CS_SNAPPROCESS;函数第二个参数th32ProcessID`则指定了进程的标识号,当设置为0时指定当前进程。如果成功函数将返回一个包含进程信息的系统快照句柄。在得到快照句柄之后只能以只读的方式对其进行访问。至于对系统快照句柄的使用同普通对象句柄的使用并没有什么太大区别,在使用完之后也需要通过CloseHandle()函数将其销毁。
  在得到系统的快照句柄后,就可以对当前进程的标识号进行枚举了,通过这些枚举出的进程标识号可以很方便的对进程进行管理。进程标识号通过函数 Process32First() 和 Process32Next()而得到,这两个函数可以枚举出系统当前所有开启的进程,并且可以得到相关的进程信息。 这两个函数原型声明如下:

BOOL WINAPI Process32First(HANDLE hSnapshot, LPPROCESSENTRY32 lppe);

BOOL WINAPI Process32Next(HANDLE hSnapshot,LPPROCESSENTRY32 lppe);

  以上两个函数分别用于获得系统快照中第一个和下一个进程的信息,并将获取得到的信息保存在指针lppe所指向的PROCESSENTRY32结构中。函数第一个参数hSnapshot为由CreateToolhelp32Snapshot()函数返回得到的系统快照句柄;第二个参数lppe为指向结构 PROCESSENTRY32的指针,PROCESSENTRY32结构可对进程作一个较为全面的描述,其定义如下:

typedef struct tagPROCESSENTRY32 {

DWORD dwSize; // 结构大小;

DWORD cntUsage; // 此进程的引用计数;

DWORD th32ProcessID; // 进程ID;

DWORD th32DefaultHeapID; // 进程默认堆ID;

DWORD th32ModuleID; // 进程模块ID;

DWORD cntThreads; // 此进程开启的线程计数;

DWORD th32ParentProcessID; // 父进程ID;

LONG pcPriClassBase; // 线程优先权;

DWORD dwFlags; // 保留;

char szExeFile[MAX_PATH]; // 进程全名;

} PROCESSENTRY32;

  以上三个API函数均在头文件tlhelp32.h中声明,运行时需要有kernel32.lib库的支持。通过这三个函数可以枚举出当前系统已开启的所有进程,并可获取到进程的各相关信息,下面给出一个简单的应用示例。在此示例中将枚举出系统的所有进程,并获取各进程的标识号和相应程序的绝对路径,进程标识号在下一步对进程的管理中将要用到,程序路径则直接通过列表控件显示出来:

// PROCESSENTRY32结构对象

PROCESSENTRY32 pe;

// 创建快照句柄

HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

// 先搜索系统中第一个进程的信息

Process32First(hSnapshot, &pe);

// 下面对系统中的所有进程进行枚举,并保存其信息

do{

// 把进程对应的文件路径名填入列表框

int index = m_ctlwndList.AddString(pe.szExeFile);

// 设置列表框中该项的Data相应的进程的ID号,利于以后终止该进程

m_ctlwndList.SetItemData(index, pe.th32ProcessID);

} while (Process32Next(hSnapshot, &pe));

// 关闭快照句柄

CloseHandle(hSnapshot);

三、对进程的管理

  在得到各枚举进程的标识号后就可以实现对进程的管理了,由于被管理进程在当前进程之外,因此必须首先通过OpenProcess()函数来获取一个已经存在的进程对象的句柄,然后才可以通过该句柄对指定的进程进行管理和控制。在OpenProcess()函数的调用时把进程标识号作为参数传入, OpenProcess()函数的原型声明如下:

HANDLE OpenProcess(DWORD dwDesiredAccess, // 访问标志

BOOL bInheritHandle, // 处理继承的标志

DWORD dwProcessId // 进程标识号);


  如果函数执行成功将返回由进程标识号指定的进程对象句柄。下面同样也对其给出一个简单的应用示例,在此示例中根据所获取的进程对象句柄通过TerminateProcess()函数将指定的进程终止:

// 获得此时列表框中的所选项的数据,即该项对应的进程的ID值

int index = m_ctlwndList.GetCurSel();

// 获得此时列表框中的选项,即该项对应的进程的ID值

DWORD data = m_ctlwndList.GetItemData(index);

// 利用进程的ID值,打开该进程,获得进程句柄

HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE,data);

// 检测句柄的有效性,如有效则终止该进程

if (hProcess)

TerminateProcess(hProcess,0);

  由于需要在调用TerminateProcess()函数终止进程时确保进程句柄可有效使用,因此在前面调用OpenProcess()时,需要指定其访问标致为PROCESS_TERMINATE。

四、小结

  本文主要对系统快照以及通过借助系统快照而对系统当前进程进行枚举、管理的实现方法做了简要介绍。在本文只讨论了包含有进程信息的系统快照,感兴趣的读者完全可以用类似的方法实现对包含有线程、堆或是摸块等信息的系统快照的应用。本文所述程序在Windows 98下由Microsoft Visual C++ 6.0编译通过。

希望本文所述对大家的VC程序设计有所帮助。

 类似资料:
  • 本文向大家介绍VC++中进程与多进程管理的方法详解,包括了VC++中进程与多进程管理的方法详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了VC++中进程与多进程管理的方法,分享给大家供大家参考。具体方法分析如下: 摘要: 本文主要介绍了多任务管理中的多进程管理技术,对进程的互斥运行、子进程的创建与结束等作了较详细的阐述。 关键词: VC++6.0;进程;环境变量;子进程 进程   进程

  • 本文向大家介绍python实现停车管理系统,包括了python实现停车管理系统的使用技巧和注意事项,需要的朋友参考一下 Python停车管理系统可实现车辆入库,按车牌号或者车型查询车辆,修改车辆信息,车辆出库时实现计费,按车型统计车辆数和显示全部车辆信息的功能 (1)定义车辆类,属性有车牌号、颜色、车型(小汽车、小卡、中卡和大卡)、到达的时间和离开的时间等信息和相关的对属性做操作的行为。 (2)定

  • 本文向大家介绍java实现学籍管理系统,包括了java实现学籍管理系统的使用技巧和注意事项,需要的朋友参考一下 本教程为大家分享了学籍管理系统的具体java代码,供大家参考,具体内容如下 1.需求分析 1.1系统功能设计 (1)能够查询学生的基本信息,如:学号,姓名年龄,班级和性别 (2)能对表格中的学生信息实现增加,删除,查找,修改等功能 (3)能将数据保存到MySQL数据库中,记录下来 (4)

  • 本文向大家介绍mybatis实现图书管理系统,包括了mybatis实现图书管理系统的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了mybatis实现图书管理系统的具体代码,供大家参考,具体内容如下 在项目开始前先将数据库中的关系表建立,先分析需要几个模块表,用户,图书,类别,租借,购买,简单的分成这五个。 用户表 图书表 类别 租借 购买 在表中简单插入数据 建立工程 1、配置环境导

  • 本文向大家介绍Java实现医院管理系统,包括了Java实现医院管理系统的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Java实现医院管理系统的具体代码,供大家参考,具体内容如下 1.开发工具 NetBeans8.2 Mysql5.7 mysql-connector-java-5.1.6.jar 2.演示 登录界面 增删查改界面 3.源码 网上难找一个带界面的管理系统源码,我把这简单

  • 本文向大家介绍Java实现购物管理系统,包括了Java实现购物管理系统的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Java实现购物管理系统的具体代码,供大家参考,具体内容如下 重点内容 JAVA分支结构练习 动态数组 注册表读写删 代码: 更多学习资料请关注专题《管理系统开发》。 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。