1.此处进程名是指进程可执行文件的名称(任务管理器进程列表中显示的映像名称);
2.windows下没有现成的API,实现思路采用CreateToolhelp32Snapshot函数创建进程快照然后依次遍历比较;
3.使用CreateToolhelp32Snapshot函数需要包含头文件#include<tlhelp32.h>
4.具体原理讲解:
HANDLE WINAPI CreateToolhelp32Snapshot(
_In_ DWORD dwFlags, //用来指定“快照”中需要返回的对象,可以是TH32CS_SNAPPROCESS等
_In_ DWORD th32ProcessID //一个进程ID号,用来指定要获取哪一个进程的快照,当获取系统进程列表或 获取当前进程快照时可以设为0
);
1.dwFlags,标志位,可取如下值:
TH32CS_INHERIT ——表示快照句柄是可继承的
TH32CS_SNAPALL ——包括系统中的所有进程和线程,以及th32ProcessID中指定的进程的堆和模块
TH32CS_SNAPHEAPLIST ——包括快照中th32ProcessID中指定的进程的所有堆(参阅:Heap32ListFirst)
TH32CS_SNAPMODULE ——包括快照中th32ProcessID中指定的进程的所有模块
TH32CS_SNAPMODULE32 ——包括从64位进程调用时快照中的th32ProcessID中指定的进程的所有32位模块
TH32CS_SNAPPROCESS ——包括快照中系统中的所有进程,要枚举进程,请参阅Process32First
TH32CS_SNAPTHREAD ——包括快照中系统中的所有线程,要枚举线程,请参阅Thread32First
2.th32ProcessID,一个进程ID号,用来指定要获取哪一个进程的快照,当获取系统进程列表或获取当前进程快照时可以设为0。
当指定TH32CS_SNAPHEAPLIST,TH32CS_SNAPMODULE,TH32CS_SNAPMODULE32或TH32CS_SNAPALL值时,使用此参数。否则,它将被忽略,并且所有进程都包括在快照中。
3.返回值
如果函数成功,它将返回一个打开的句柄到指定的快照。
如果函数失败,则返回INVALID_HANDLE_VALUE。要获取扩展错误信息,请调用GetLastError。可能的错误代码包括ERROR_BAD_LENGTH。
这里我们要获取系统中所有进程,所以dwFlags参数传入TH32CS_SNAPPROCESS,th32ProcessID传入NULL,创建系统快照。
5.得到系统进程快照句柄后,需要调用Process32First函数查找系统进程快照中的第一个进程,函数格式如下:
BOOL Process32First(
HANDLE hSnapshot,
LPROCESSENTRY32 lppe
);
再调用Process32Next函数列出系统中其它进程,格式如下:
BOOL Process32Next(
HANDLE hSnapshot,
LPROCESSENTRY32 lppe
);
两个函数的参数是一样的,其中hSnapshot是由CreateToolHelp32Snapshot函数返回的系统进程快照的句柄;而lppe是指向PROCESSENTRY的结构体指针,进程的详细信息保存在结构体中。PROCESSENTRY32结构体定义如下:
6.具体实现代码
PROCESSENTRY32结构如下:
typedef struct tagPROCESSENTRY32{
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;
DWORD GetProcessIdByName(TCHAR *pProcess)
{
DWORD ProcessId = NULL;
PROCESSENTRY32 lppe;//PROCESSENTRY32结构体如参考上面所示
//在使用这个结构前,先设置它的大小
lppe.dwSize = sizeof(lppe);
//给系统内所有的进程拍个快照
HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL);
if(hProcessSnap == INVALID_HANDLE_VALUE)
{
printf("CreateToolhelp32Snapshot调用失败。\n");
return NULL;
}
//遍历进程快照,轮流显示每个进程的信息
BOOL bMore = ::Process32First(hProcessSnap, &lppe);
while(bMore)
{
if(strcmp(lppe.szExeFile, pProcess) == 0)
{
ProcessId = lppe.th32ProcessID;
break;
}
bMore = ::Process32Next(hProcessSnap, &lppe);
}
//清理hProcessSnap对象
::CloseHandle(hProcessSnap);
//返回匹配的进程id,如果没有匹配则返回NULL
return ProcessId;
}