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程序设计有所帮助。

(0)

相关推荐

  • 判断指定的进程或程序是否存在方法小结(vc等)

    一.判断指定程序名的进程是否存在     BOOL EnumWindows( WNDENUMPROC lpEnumFunc, // pointer to callback function LPARAM lParam //   application-defined value);        The EnumWindows function enumerates all top-level windows on the screen by passing the handle to each

  • VC判断进程是否具有administrator权限的方法

    本文实例讲述了VC判断进程是否具有admin权限的方法.是的话返回TRUE,否则为FALSE.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: static BOOL IsAdmin(void)  {       HANDLE                   hAccessToken;       BYTE                     InfoBuffer[1024];          PTOKEN_GROUPS            ptgGroups;    

  • VC使用TerminateProcess结束进程实例

    本文实例讲述了VC使用TerminateProcess结束进程的方法,分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: int KillProcess(LPCSTR pszClassName, LPCSTR pszWindowTitle) {     HANDLE hProcessHandle;     ULONG nProcessID;     HWND TheWindow;     TheWindow = ::FindWindow( NULL, pszWindowTitle )

  • VC++获得当前进程运行目录的方法

    本文实例讲述了VC++获得当前进程运行目录的方法,分享给大家供大家参考.具体实现方法如下: 该实例主要通过利用windows API获得,具体代码如下: 复制代码 代码如下: CString GetAppPath() {   CString strAppPath;  // 保存结果   TCHAR szModuleFileName[MAX_PATH]; // 全路径名   TCHAR drive[_MAX_DRIVE];  // 盘符名称,比如说C盘啊,D盘啊   TCHAR dir[_MAX_

  • VC实现A进程窗口嵌入到B进程窗口中显示的方法

    本文通过一个Demo示例讲述把A应用程序嵌入到B应用程序中显示的方法. 主要代码如下: //在B应用启动时创建A进程 CreateProcess(_T("A.exe"),NULL,NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,NULL,NULL,NULL); Sleep(30); HWND hWndChild = FindWindow(_T("AAA"),_T("AAA")); while(!hWndChild)

  • VC实现获取当前正在运行的进程

    本文实例讲述了VC实现获取当前正在运行的进程.分享给大家供大家参考.具体实现方法如下: #include <windows.h> #include <tlhelp32.h> #include <stdio.h> int main(int argc,char* argv[]) { PROCESSENTRY32 pe32; //再使用这个结构体前先定义它的大小 pe32.dwSize=sizeof(pe32); //给系统内的所有进程拍一个快照 HANDLE hProces

  • VC++中进程与多进程管理的方法详解

    本文实例讲述了VC++中进程与多进程管理的方法,分享给大家供大家参考.具体方法分析如下: 摘要: 本文主要介绍了多任务管理中的多进程管理技术,对进程的互斥运行.子进程的创建与结束等作了较详细的阐述. 关键词: VC++6.0:进程:环境变量:子进程 进程 进程是当前操作系统下一个被加载到内存的.正在运行的应用程序的实例.每一个进程都是由内核对象和地址空间所组成的,内核对象可以让系统在其内存放有关进程的统计信息并使系统能够以此来管理进程,而地址空间则包括了所有程序模块的代码和数据以及线程堆栈.堆分

  • VC创建进程CreateProcess的方法

    本文实例讲述了VC创建进程CreateProcess的方法.分享给大家供大家参考.具体实现方法如下: #include "stdafx.h" #include <windows.h> #include <stdio.h> int main (int argc,char* argv[]) { char szCommandLine[]="cmd"; STARTUPINFO si={sizeof(si)}; PROCESS_INFORMATION

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

    本文实例讲述了VC下通过系统快照实现进程管理的方法,分享给大家供大家参考.具体实现方法如下: 一.引言 每一个应用程序实例在运行起来后都会在当前系统下产生一个进程,大多数应用程序均拥有可视界面,用户可以通过标题栏上的关闭按钮关闭程序.但是也有为数不少的在后台运行的程序是没有可视界面的,对于这类应用程序用户只能通过CTRL+ALT+DEL热键呼出"关闭程序"对话框显示出当前系统进程列表,从中可以结束指定的任务.显然,该功能在一些系统监控类软件中还是非常必需的,其处理过程大致可以分为两步:

  • django认证系统实现自定义权限管理的方法

    本文记录使用django自带的认证系统实现自定义的权限管理系统,包含组权限.用户权限等实现. 0x01. django认证系统 django自带的认证系统能够很好的实现如登录.登出.创建用户.创建超级用户.修改密码等复杂操作,并且实现了用户组.组权限.用户权限等复杂结构,使用自带的认证系统就能帮助我们实现自定义的权限系统达到权限控制的目的. 0x02. 认证系统User对象 User对象顾名思义即为表示用户的对象,里面的属性包括: username password email first_na

  • 详解Linux监控重要进程的实现方法

    不管后台服务程序写的多么健壮,还是可能会出现core dump等程序异常退出的情况,但是一般情况下需要在无 人为干预情况下,能够自动重新启动,保证服务进程能够服务用户.这时就需要一个监控程序来实现能够让服务进程自动重新启动.查阅相关资料及尝试一些方法之后,总结linux系统监控重要进程的实现方法:脚本检测和子进程替换. 1.脚本检测 (1) 基本思路: 通过shell命令(ps -e | grep "$1" | grep -v "grep" | wc -l) 获取

  • linux系统之进程管理详解

    目录 1.进程与线程的概念 2.什么是进程管理 3.进程管理的作用 4.Linux进程的几种状态 5.进程与线程的关系 (1)线程与进程的关系 (2)总结 1.进程与线程的概念 来源百度百科: 进程(Process) 是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础. 在当代面向线程设计的计算机结构中,进程是线程的容器.程序是指令.数据及其组织形式的描述,进程是程序的实体.是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和

  • 基于Python 的进程管理工具supervisor使用指南

    Supervisor 是基于 Python 的进程管理工具,只能运行在 Unix-Like 的系统上,也就是无法运行在 Windows 上.Supervisor 官方版目前只能运行在 Python 2.4 以上版本,但是还无法运行在 Python 3 上,不过已经有一个 Python 3 的移植版 supervisor-py3k. 什么情况下我们需要进程管理呢?就是执行一些需要以守护进程方式执行的程序,比如一个后台任务,我最常用的是用来启动和管理基于 Tornado 写的 Web 程序. 除此之

  • 深入php-fpm的两种进程管理模式详解

    php-fpm的两种进程管理模式php-fpm的进程数也是可以根据设置分为动态和静态的.一种是直接开启指定数量的php-fpm进程,不再增加或者减少:另一种则是开始的时候开启一定数量的php-fpm进程,当请求量变大的时候,动态的增加php-fpm进程数到上限,当空闲的时候自动释放空闲的进程数到一个下限.这两种不同的执行方式,可以根据服务器的实际需求来进行调整.这里先说一下涉及到这个的几个参数吧,他们分别是pm.pm.max_children.pm.start_servers.pm.min_sp

  • 深入理解Node.js中的进程管理

    前言 本文主要对 Node.js 中进程管理相关的东西做一个简单介绍,包括 process 对象.child_process 模块和cluster 模块,详细的 API 可以查看官方文档,下面来看看详细的介绍吧. Process 对象 process 是 Node.js 的一个全局对象,可以在任何地方直接使用而不需要 require 命令加载.process 对象提供了 当前 node 进程 的命令行参数.标准输入输出.运行环境和运行状态等信息. 常用属性 argv process.argv 属

  • Nginx使用的php-fpm的两种进程管理方式及优化

    PS:前段时间配置php-fpm的时候,无意中发现原来它还有两种进程管理方式.与Apache类似,它的进程数也是可以根据设置分为动态和静态的. php-fpm目前主要又两个分支,分别对应于php-5.2.x的版本和php-5.3.x的版本.在5.2.x的版本中,php-fpm.conf使用的是xml格式,而在新的5.3.x版本中,则是和php.ini一样的配置风格. 在5.2.x版本中,php-fpm.conf中对于进程管理号称是有两种风格,一种是静态(static)的,一种是类似于apache

  • ubuntu系统下使用pm2设置nodejs开机自启动的方法

    1.安装pm2 : npm install pm2 -gd 这时在命令行下执行pm2命令可能找不到,需要执行如下命令 1.创建软链接:ln -s /home/XXX/node-node-v6.11.5-linux-x64/bin/pm2 /usr/local/bin/pm2 2.一下命令需要在root用户下执行: sudo pm2 start ./bin/www sudo pm2 save sudo pm2 startup sudo pm2 save 3.重启系统试一下:如果不行执行 chatt

随机推荐