0x00 前言
文章中的文字可能存在语法错误以及标点错误,请谅解;
如果在文章中发现代码错误或其它问题请告知,感谢!
本例运行系统环境为windows 10,使用VS2010编译运行。
0x01 代码实现
1. 实现思路
取得正在运行的进程名称和ID的代码实现思路如下:
1.使用CreateToolhelp32Snapshot()函数给当前系统执行的进程拍摄快照以获得进程列表;
2.使用Process32First()以及Process32Next()函数遍历列表,将获得的进程名称和ID打印出来。
下面介绍相关函数:
1.CreateToolhelp32Snapshot()用于获取系统内指定的进程快照,也可以获得被这些进程使用的堆、模块和线程的快照。使用方法如下:
HANDLE WINAPI CreateToolhelp32Snapshot(
DWORD dwFlags; //用来指定快照中需要返回的对象
DWORD th32ProcessID; //一个进程的ID,用来指定要获取哪一个进程的快照
//若想获得系统进程列表或获取当前进程快照时可以设置成0
);
dwFlags参数指定获得列表的类型,其取值如下:
(1)TH32CS_SNAPHEAPLIST 枚举th32ProcessID参数指定的进程中的堆。
(2)TH32CS_SNAPMODULE 枚举th32ProcessID参数指定的进程中的模块。
(3)TH32CS_SNAPPROCESS 枚举系统范围内的进程,此时th32ProcessID参数被忽略。
(4)TH32CS_SNAPTHREAD 枚举系统范围内的线程,此时th32ProcessID参数被忽略。
函数执行成功会返回一个快照句柄,否则返回INVALID_HANDLE_VALUE(-1)。
2.Process32First()以及Process32Next()从快照列表中获取进程信息。Process32First()用来获取首次调用,以后由Process32Next()进行循环调用,直到列表被调用完毕,返回FLASE。
BOOL WINAPI Process32First(
HANDLE hSnapshot, //快照句柄
LPPROCESSENTRY32 lppe //指向PEOCESSENTRY32结构的指针
);
BOOL WINAPI Process32Nextt(
HANDLE hSnapshot, //快照句柄
LPPROCESSENTRY32 lppe //指向PEOCESSENTRY32结构的指针
);
LPPROCESSENTRY32结构体定义如下:
typedef
{
DWORD dwSize; //结构的长度,需要预先设置
DWORD cntUsage; //进程的引用记数
DWORD th32ProcessID; //进程ID
DWORD th32DefaultHeapID;//进程默认堆的ID
DWORD th32ModuleID; //进程模块的ID
DWORD cntThreads; //进程创建的线程数
DWORD th32ParentProcessID;//进程的父线程ID
LONG pcPriClassBase; //进程创建的线程基本优先级
DWORD dwFlags; //内部使用
CHAR szExeFile[MAX_PATH];//进程对应的可执行文件名
}PROCESSENTRY32;
2. 代码实现
// 进程打印.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include<Windows.h>
#include<TlHelp32.h>
#include<stdio.h>
int main(int argc, char *argv[])
{
PROCESSENTRY32 pe32;
//在使用这个结构之前,先设置它的大小
pe32.dwSize = sizeof(pe32);
//给系统内所有的进程拍一个快照
HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(hProcessSnap == INVALID_HANDLE_VALUE)
{
printf("CreateToolhelp32Snapshot调用失败\n");
return -1;
}
//遍历进程快照,轮流显示每个进程的信息
BOOL bMore = ::Process32First(hProcessSnap,&pe32);
while(bMore)
{
printf("进程名称:%ls\n",pe32.szExeFile);
printf("进程ID号:%u\n\n",pe32.th32ProcessID);
bMore = ::Process32Next(hProcessSnap,&pe32);
}
//不要忘记清除snapshot对象
::CloseHandle(hProcessSnap);
system("pause");
return 0;
}
运行结果:
以上。
参考文档:
1.张铮,孙宝山,周立天.Windows程序设计(第3版)[M].北京;人民邮电出版社,2018.7.