Ⅰ. はじめに
タイトルの通り「C++でプロセス名からプロセスIDを取得する」方法です。
Ⅱ. サンプルプログラム
1. CreateToolhelp32Snapshot を利用する場合
#include <Windows.h> #include <tlhelp32.h> #include <iostream> DWORD GetProcessIdByName(const wchar_t *processName) { auto entry = PROCESSENTRY32{ sizeof(PROCESSENTRY32) }; auto hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (Process32First(hSnapshot, &entry)) { do { if (wcsstr(processName, entry.szExeFile)) { CloseHandle(hSnapshot); return entry.th32ProcessID; } } while (Process32Next(hSnapshot, &entry)); } CloseHandle(hSnapshot); return -1; } int main() { auto processId = GetProcessIdByName(L"notepad.exe"); std::cout << "ProcessId=" << processId << std::endl;; return 0; }
2. EnumProcesses を利用する場合
#include <Windows.h> #include <psapi.h> #include <iostream> DWORD GetProcessIdByName(const wchar_t *targetProcessName) { DWORD processIds[1024]; DWORD cbNeeded; if (EnumProcesses(processIds, sizeof(processIds), &cbNeeded)) { for (DWORD i = 0; i < cbNeeded / sizeof(DWORD); i++) { TCHAR processName[MAX_PATH] = { 0 }; auto hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processIds[i]); if (hProcess != NULL) { DWORD size = MAX_PATH; if (QueryFullProcessImageName(hProcess, NULL, processName, &size)) { // std::wcout << processName << "," << targetProcessName << std::endl; if (wcsstr(processName, targetProcessName)) { CloseHandle(hProcess); return processIds[i]; } } CloseHandle(hProcess); } } } return -1; } int main() { auto processId = GetProcessIdByName(L"notepad.exe"); std::cout << "ProcessId=" << processId << std::endl;; return 0; }
3. NtQuerySystemInformationを使用する方法
Ⅲ. 実行結果