來源:https://blog.csdn.net/Bdyjy/article/details/53096891?utm_source=blogxgwz5
通過遍歷系統中所有進程的進程名來獲得目標進程的ID。
要遍歷系統中所有的進程我們需要以下三個函數:
1、CreateToolhelp32Snapshot
函數原型:
HANDLE WINAPI CreateToolhelp32Snapshot( _In_ DWORD dwFlags, _In_ DWORD th32ProcessID );
MSDN地址:https://msdn.microsoft.com/en-us/library/windows/desktop/ms682489(v=vs.85).aspx
這個函數的作用是:Takes a snapshot of the specified processes, as well as the heaps, modules, and threads used by these processes.即建立一個指定進程的快照。
參數:
dwFlags:快照的類型,我們這里選擇TH32CS_SNAPPROCESS,表示所有進程。
th32ProcessID:要包括在快照中的進程ID,我們設為0,表示當前進程。
返回值:
成功返回快照句柄,失敗返回INVALID_HANDLE_VALUE;
2、Process32First
函數原型:
BOOL WINAPI Process32First( _In_ HANDLE hSnapshot, _Inout_ LPPROCESSENTRY32 lppe );
MSDN地址:https://msdn.microsoft.com/en-us/library/windows/desktop/ms684834(v=vs.85).aspx
這個函數的作用是:取得快照中第一個進程信息。
參數:
hSnapshot:快照句柄
lppe:一個PROCESSENTRY32結構的指針,用來保存進程相關的信息,其中th32ProcessID成員保存着次進程的ID。
返回值:
成功返回true,失敗返回false。
3、Process32Next
函數原型:
BOOL WINAPI Process32Next( _In_ HANDLE hSnapshot, _Out_ LPPROCESSENTRY32 lppe );
MSDN地址:https://msdn.microsoft.com/en-us/library/windows/desktop/ms684836(v=vs.85).aspx
這個函數的作用是:返回快照中下一個進程的信息。
參數:
hSnapshot:和上一個函數一樣,也是快照句柄
lppe:也和上一個函數一樣
返回值:
成功返回true,失敗返回false
所以流程是先調用CreateToolhelp32Snapshot獲取所有進程快照,再調用Process32First,然后不停調用Process32Next,直到Process32Next返回false,完成遍歷。在每次調用Process32Next時比較此進程的進程名與目的進程名,相同則返回進程id退出循環。
代碼如下:
#include <TlHelp32.h> // 頭文件 bool m_GetPIDByName(TCHAR * processName) { // 創建系統快照 HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hSnapshot == INVALID_HANDLE_VALUE) { return false; } PROCESSENTRY32 ps; ZeroMemory(&ps, sizeof(PROCESSENTRY32)); ps.dwSize = sizeof(PROCESSENTRY32); if (!Process32First(hSnapshot, &ps)) { return false; } do { if (lstrcmpi(ps.szExeFile, processName) == 0) { // 保存進程ID m_pID = ps.th32ProcessID; CloseHandle(hSnapshot); return true; } } while (Process32Next(hSnapshot, &ps)); return false; }
