2024年3月25日发(作者:)

浅谈Visual C++系统进程管理器的开发

[摘要]Visual C++是Microsoft公司开发的一个功能非常强大的可视化开发工

具。本文介绍了利用Visual C++开发系统进程管理器的基本理论、设计思想及设

计步骤,帮助广大程序设计爱好者熟悉和掌握Visual C++程序开发,起到抛砖引

玉的作用。

【关键词】Visual C++;进程;CreateToolhelp32Shapshot();TerminateProcess()

1.引言

在现代的操作系统中,进程是一个极其重要的概念,操作系统及操作系统中

应用和程序的正常运行离不开进程的创建和管理。进程是一个开始执行但是还没

有结束的程序,是可执行文件的具体实现。其工作原理为当应用程序被系统调用

到内存以后,系统会给程序分配一定的资源,然后进行一系列的复杂操作,使应

用程序变成进程以供系统调用。系统中只有进程而没有应用程序。

为了区分各个不同的进程,系统给每一个ID以便识别。为了充分利用资源,

系统还对进程区分了不同的状态,将进程分为新建、运行、阻塞、就绪和完成5

个状态。新建表示进程正在被创建;运行是进程正在运行;阻塞是进程正在等待

某一个事件发生;就绪表示系统正在等待CPU来执行命令;而完成表示进程已

经结束了,系统正在回收资源。

因此,实时监控系统中各个应用程序所对应的进程,对于计算机用户来说尤

其重要。系统中运行的进程实际上比我们在任务管理器中看到的更多,有些恶意

的程序是无法在任务栏和任务管理器中看到的。本文介绍如何显示系统当前运行

的所有进程,及如何终止运行的进程。

运行程序,点按钮“获取进程”,则系统当前运行的所有进程名称以及进程对

应的ID、涉及的线程数、优先级便显示在列表视图里面了。图1是程序运行界

面。

2.程序设计思想

开发系统进程管理器,需要了解两个函数:CreateToolhelp32Shapshot()函数

用来获得某一时刻系统的进程、堆(heap)、模块(module)或线程的快照信息;

TerminateProcess()函数用来停止某个正在运行的进程。

CreateToolhelp32Shapshot()函数包含于Toolhelp32函数组。Toolhelp32函数

级是一组寄存在中的WindowsAPI函数,它能够通过快照(Snapshot)

获得驻留在系统内存中的进程表、线程表、模块表和堆表,并提供函数来枚举系

统中的进程、线程以及模块信息,是一个非常重要的函数组。Toolhelp32中的常

用的函数包括CreateToolhelpShapshot()、ProcessFirst()和ProcessNext()。本程序

将利用CreateToolhelp32Shapshot()函数获取某一时刻系统的进程,并利用

ProcessFirst()函数和ProcessNext()函数将所有进程存放一个动态数组中,并利用

List控件加以显示。

系统中有个进程链表,用来保存当前运行的所有进程的信息,程序首先调用

函数CreateToolhelp32Snapshot获得进程链表的句柄,然后调用函数ProcessFirst

和ProcessNext获得进程结构PROCESSENTRY32,进程的信息都包括在其中。

终止一个进程,首先调用OpenProcess函数获得指定函数的句柄,然后调用函数

TerminateProcess使指定进程结束。

3.程序设计步骤

⑴使用AppWizard生成一个基于对话框的MFC应用程序。

⑵编辑主对话框,添加按钮“获取进程”和“终止进程”,添加List Control控

件,按钮和 List Control 控件的设置见附带源代码。

⑶向类CshowAllProcessDlg中添加成员变量:

DWORD m_ProcessIndex[50];//存放所有进程的ID

⑷分别为按钮“获取进程”和“终止进程”添加消息处理函数OnGetProcess()和

OnStopProcess()。对话框的初始化以及消息响应的实现请参见附带源代码。

4.主要API函数

⑴HANDLE WINAPI CreateToolhelp32Snapshot(DWORD dwFlags,DWORD

th32ProcessID);

功能:获得某一时刻系统中由dwFlags标识的进程、堆(heap)、模块(module)

或线程的快照信息。

⑵HANDLE OpenProcess(DWORD dwDesiredAccess,BOOL

bInheritHandle,DWORD dwProcessId);

功能:返回指定进程的句柄。

⑶BOOL WINAPI Process32First(HANDLE hSnapshot,LPPROCESSENTRY32

lppe);

功能:获得系统进程链表中第一个进程的信息。

⑷BOOL WINAPI Process32Next(HANDLE

hSnapshot,LPPROCESSENTRY32 lppe);

功能:获得系统进程链表中下一个进程的信息。

5.结束语

本程序的代码具有很强的独立性,可以单独使用也可配合其他代码实现其他

系统管理功能。本程序所调用的函数组是一个非常重要的函数组,利用它能够获

得驻留在系统内存的进程表、线程表、模块表和堆表,并提供函数来枚举系统中

的进程、线程以及模块信息,用户可以参考相关的工具书,进行其他系统应用程

序的开发。

参考文献

[1]陈争光《Visual C++入门与提高》科学出版社 2008.10

[2]严华峰《Visual C++课程设计案例精编》中国水利水电出版社 2004.02

[3]戴博等《VISUAL C++ 程序员成长攻略》中国水利水电出版社2007.06

[4]王维玉《Visual C++6.0高级编程技术精粹》科学出版社 2008.11