VC下通过系统快照实现进程管理 - 编程吧

上一篇 | 下一篇

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

发布: 2006-8-29 06:23 | 作者: 佚名 | 来源: 不详 | 查看: 39次

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

当前进程的枚举

以上两个函数分别用于获得系统快照中第一个和下一个进程的信息,并将获取得到的信息保存在指针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);

如果函数执行成功将返回由进程标识号指定的进程对象句柄。下面同样也对其给出一个简单的应用示例,在此示例中根据所获取的进程对象句柄通过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编译通过。



TAG: 编程

字号: | 推荐给好友

 

评分:0

我来说两句

seccode