Windows PC 上で走っているプロセス一覧を取りたいことがあります。
いままではプロセスをデバッグモードで起動して DLL 一覧を取ったりしていたのですが、便利な API があることに気づきました。(知らなかっただけ??)
https://learn.microsoft.com/ja-jp/windows/win32/toolhelp/taking-a-snapshot-and-viewing-processes
#include <windows.h>
#include <tlhelp32.h>
#include <iostream>
/*
* 指定したプロセスが読み込む DLL を取得する
*/
bool EnumDLLChildren(DWQRD dwProcID) {
HANDLE hModSnap;
MODULEENTRY32 me32;
hModSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcID);
if (hModSnap == INVALID_HANDLE_VALUE) {
return false;
}
me32.dwSize = sizeof(me32);
if (!Module32First(hModSnap, &me32)) {
CloseHandle(hModSnap);
return false;
}
do {
wcout << L"Module:" << me32.szExePath << std::wendl;
} while (Module32Next(hModSnap, &me32));
CloseHandle(hModSnap);
return true;
}
/**
* 起動している全てのプロセス名を取得する
*/
bool EnumInvokedProcesses() {
HANDLE hProcSnap;
HANDLE hProc;
PROCESSENTRY32 pe32;
// プロセス一覧を取得する
hProcSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcSnap == INVALID_HANDLE_VALUE) {
return false;
}
pe32.dwSize = sizeof(pe32);
if (!Process32First(hProcSnap, &pe32)) {
CloseHandle(hProcSnap);
return false;
}
do {
wcout << L"Process:" << pe32.szExeFile << std::wendl;
// 読み込んでいる DLL 一覧を取得する
EnumDLLChildren(pe32.th32ProcessID);
} while (Process32Next(hProcSnap, &pe32));
CloseHandle(hProcSnap);
return true;
}
今までの苦労は何だったのだろうか。。
コメントを残す