|
9.1.3 获取系统进程的技巧
1.问题阐述
进程的定义是为执行程序指令的线程而保留的一系列资源的集合。进程是一个可执行的程序,由私有虚拟地址空间、代码、数据和其他操作系统资源(如进程创建的文件、管道、同步对象等)组成。进程是一些所有权的集合,一个进程拥有内存、CPU运行时间等一系列资源,为线程的运行提供一个环境,每个进程都有它自己的地址空间和动态分配的内存、线程、文件和其他一些模块。
2.实现技巧
系统统快照的获取可以通过Win32 API函数CreateToolhelp32Snapshot()来完成,通过该函数不仅可以获取进程的快照,同样可以获取堆、模块和线程的系统快照。函数的声明如下:
HANDLE WINAPI CreateToolhelp32Snapshot( DWORD dwFlags, //指定要创建包含哪一类系统信息的快照函数 DWORD th32ProcessID //指定进程的ID号,当设定为0时表示指定当前进程 );
| 一旦系统得到系统快照句柄,就可以对当前的标识号进行枚举,进程号通过函数Process32First()和Procee32Next()得到,这两个函数可以用于获取系统快照中第一个和下一个系统的信息,这两个函数的声明如下:
BOOL WINAPI Process32First( HANDLE hSnapshot, // 系统快照句柄 LPPROCESSENTRY32 lppe // 指向结构体PROCESSENTRY32的指针 ); BOOL WINAPI Process32Next( HANDLE hSnapshot, // 系统快照句柄 LPPROCESSENTRY32 lppe // 指向结构体PROCESSENTRY32的指针 ); | 3.实例代码
#include <tlhelp32.h> void CTestView::OnRButtonDown(UINT nFlags, CPoint point) { CString StrInfo="系统当前进程包括:\n"; int nProcess =0; HANDLE snapshot=CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0) ; if(snapshot == NULL)return ; SHFILEINFO shSmall; PROCESSENTRY32 processinfo ; processinfo.dwSize=sizeof(processinfo) ; BOOL status=Process32First(snapshot,&processinfo) ; while (status) { ZeroMemory(&shSmall, sizeof(shSmall)); SHGetFileInfo(processinfo.szExeFile,0,&shSmall,sizeof(shSmall), SHGFI_ICON|SHGFI_SMALLICON); StrInfo+=processinfo.szExeFile; StrInfo+="\n"; status = Process32Next (snapshot, &processinfo) ; nProcess++; } MessageBox(StrInfo,"信息提示",MB_OK); CView::OnRButtonDown(nFlags, point); } |
4.小结
获取当前系统所有已启动的进程,通常分为两个过程:首先获取系统进程快照,然后根据快照枚举进程。在Windows操作系统下,系统已为所有保存在系统内存中的进程、线程及模块等当前状态的信息制作了一个系统快照,用户可以通过对系统快照的访问完成对进程当前状态的检测。
【责任编辑: 夏书 TEL:(010)68476606】
|