首页 > 范文大全 > 正文

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

开篇:润墨网以专业的文秘视角,为您筛选了一篇浅谈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函数级是一组寄存在Kernel32.dll中的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