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


发布评论