很多时候,我们要枚举当前系统中所有运行程序的信息,最基本的就包括pid、路径、exe名称,这里我封装成一个类供有需要的朋友使用。

说明

现在枚举系统进程信息常用有两种方法:
1.ToolHelp系列函数
2.PSAPI系列函数
微软现在推荐的是使用ToolHelp函数,可以下载最后链接中的演示程序看到,ToolHelp系列函数相比PSAPI函数提供了更多的进程信息。

常用的还有指定进程pid,要求得到对应的exe的全路径,这里实现使用了三种方法结合的手段:
1.QueryFullProcessImageName
Vista开始提供,非常好用,但是如果程序要兼容XP则不可用,可在32位程序中查询64位信息,微软推荐使用。
2.GetModuleFileNameEx
Windows 2000 就开始有了,但是有一个致命缺点——32位程序无法查询64位程序路径
3.ZwQueryInformationProcess
ntdll导出的内核函数,拿到的是以卷标识-类似DeviceHarddiskVolume2...开始的路径,MSDN文档标注的是2000-XP可用,之后就不保证了,但实际上到现在还是可用的,需要自己导出函数来使用

接口声明

本工具类提供的静态方法如下,具体功能从命名就可以看出来:

static BOOL Enum(PFUNC_ENUM_PROCESS pEnumFunc);
static BOOL EnumOld(PFUNC_ENUM_PROCESS_OLD pEnumFunc);
static HANDLE Pid_2_Handle(DWORD pid, DWORD dwAccess=PROCESS_QUERY_LIMITED_INFORMATION);
static BOOL Pid_2_Path(DWORD pid, LPTSTR pszPath, ULONG cbPathsize);
static BOOL Handle_2_Path(HANDLE hProcess, LPTSTR pszPath, ULONG cbPathsize);
static BOOL IsWow64(HANDLE hProcess);
static BOOL IsWow64(DWORD pid);

下载

源码下载链接