图7 进程基本信息的获取 进程CPU使用率是使用Windows NT以上系统提供的性能监视器取得。Windows性能监视器所用的编程接口是以性能数据助手库(PDH.dll)及一系列 C/C++头文件(即pdh.h、pdhmsg.h和winperf.h,它们是操作系统附带的)的形式公开给用户的。部分主要代码如下: copyright paper51.com PDH_STATUS pdhStatus; http://www.paper51.com PDH_FMT_COUNTERVALUE fmtValue; paper51.com pdhStatus = PdhCollectQueryData(m_hQuery);//收集数据 copyright paper51.com pdhStatus =PdhGetFormattedCounterValue( copyright paper51.com hCounter,PDH_FMT_LONG,&dwctrType,&fmtValue);//得到格式化数据,fmtValue即是我们需要得到的CPU使用率数据。 copyright paper51.com
Windows 9X系统上不能通过以上方法获得CPU使用率,因此设计的该进程管理软件不能获取9X系统上进程的CPU使用率。 内容来自www.paper51.com 要得到进程的内存使用率要用到Psapi.dll的函数GetProcessMemoryInfo,首先在Process.h 中定义WINAPI函数类型: paper51.com GETPROCESSMEMORYINFOGetProcessMemoryInfo;,再取得内存使用数: copyright paper51.com PROCESS_MEMORY_COUNTERS pmc; 内容来自www.paper51.com
GetProcessMemoryInfo(hProcess,&pmc,sizeof(pmc)); http://www.paper51.com dwMemoryUse = pmc.WorkingSetSize;//内存使用大小 paper51.com pmc返回进程的内存使用信息,它是定义的一个PROCESS_MEMORY_COUNTERS结构,定义如下: paper51.com typedef struct_PROCESS_MEMORY_COUNTERS{ http://www.paper51.com
DWORD cb; paper51.com
DWORD PageFaultCount;//结构尺寸 内容来自论文无忧网 www.paper51.com SIZE_T PeakWorkingSetSize;//缺页数 http://www.paper51.com
SIZE_T WorkingSetSize;//当前工作集尺寸 http://www.paper51.com SIZE_T QuotaPeakPagedPoolUsage;//最高页池使用数 http://www.paper51.com SIZE_T QuotaPagedPoolUsage;//当前页池使用数 http://www.paper51.com SIZE_T QuotaPeakNonPagedPoolUsage;//最高无页池使用数 paper51.com SIZE_T QuotaNonPagedPoolUsage; //当前无页池使用数 内容来自www.paper51.com
SIZE_T PagefileUsage;//当前分配页文件空间 内容来自论文无忧网 www.paper51.com
SIZE_T PeakPagefileUsage;//最高分配页文件空间 paper51.com }PROCESS_MEMORY_COUNTERS,*PPROCESS_MEMORY_COUNTERS; 内容来自www.paper51.com 3.3.2 显示模块及线程信息 内容来自论文无忧网 www.paper51.com 模块信息有模块名、模块大小、基地址。直接通过ToolHelp API函数便可实现。主要用到的函数有: 内容来自www.paper51.com 1、hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,dwPID)该函数用于创建指定进程的模块快照。 http://www.paper51.com 2、Module32First(hModuleSnap,&me32);该函数获取指定进程的第一个模块信息,将取得的信息填充到me32中。me32是一个MODULEENTRY32结构类型,对它的定义如下: http://www.paper51.com
Typedef struct tagMODULEENTRY32{ copyright paper51.com DWORDdwSize; http://www.paper51.com DWORDth32ModuleID; http://www.paper51.com DWORDth32ProcessID; http://www.paper51.com DWORDGlblcntUsage; paper51.com DWORDProccntUsage; 内容来自论文无忧网 www.paper51.com BYTE* modBaseAddr; paper51.com DWORDmodBaseSize; 内容来自www.paper51.com
HMODULEhModule; 内容来自论文无忧网 www.paper51.com
charszModule[MAX_MODULE_NAME32 + 1]; copyright paper51.com charszExePath[MAX_PATH]; copyright paper51.com
}MODULEENTRY32; copyright paper51.com 3、Module32Next(hModuleSnap,&me32)该函数获取指定进程的下一个模块信息。 http://www.paper51.com
线程信息包括线程ID和线程优先级,也是通过ToolHelpAPI函数取得。 内容来自www.paper51.com
1、hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,0);该函数创建指定进程的线程快照,取得所有线程信息。 paper51.com 2、Thread32First(hThreadSnap,&te32);//取得指定进程的第一个线程信息将取得的信息填充到te32中。te32也是一个数据结构,它的定义和存放进程信息或存放模块信息的数据结构类似。 内容来自论文无忧网 www.paper51.com typedef struct tagTHREADENTRY32{ paper51.com DWORDdwSize;//结构体尺寸,必须在调用前指定 内容来自论文无忧网 www.paper51.com DWORDcntUsage; paper51.com DWORDth32ThreadID;//线程ID 内容来自www.paper51.com DWORDth32OwnerProcessID;//创建该线程的进程ID copyright paper51.com
LONGtpBasePri;//基本优先级 paper51.com
LONGtpDeltaPri; 内容来自www.paper51.com DWORDdwFlags; copyright paper51.com
} THREADENTRY32,*PTHREADENTRY32; 内容来自论文无忧网 www.paper51.com 3、Thread32Next(hThreadSnap,&te32);//取得指定进程的下一个模块信息。 http://www.paper51.com 获取进程模块的过程如图8。 copyright paper51.com copyright paper51.com |