Windowsにて現在起動しているプロセス名を列挙する方法をメモ
プロセスの列挙には下記の関数を利用する
HANDLE WINAPI CreateToolhelp32Snapshot( DWORD dwFlags, DWORD th32ProcessID );
dwFlagsにはどのスナップショットを取得したいかを指定できる。
具体的には、TH32CS_SNAPPROCESSの他に
TH32CS_SNAPHEAPLIST // ヒープのリスト TH32CS_SNAPMODULE // モジュールのリスト
などが指定できる。
th32ProcessIDはプロセスの列挙の場合0を指定すればよい。
スナップショットの内容は、Process32First()/Process32Next()を利用して、戻り値がFALSEになるまで呼ぶことで走査できる。
サンプルコード
#include <iostream> #include <vector> #include <string> #include <Windows.h> #include <TlHelp32.h> typedef std::vector<std::wstring> ModuleNameList; // 現在起動しているプロセス名のリストを返す ModuleNameList getModuleList() { ModuleNameList module_name_list; // スナップショットを取得 HANDLE snapshot = ::CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 ); if(snapshot == INVALID_HANDLE_VALUE) throw std::exception(); // プロセスの情報を走査 PROCESSENTRY32W entry; entry.dwSize = sizeof(entry); BOOL has_entry = ::Process32FirstW(snapshot, &entry); while(has_entry) { module_name_list.push_back(entry.szExeFile); has_entry = ::Process32NextW(snapshot, &entry); } ::CloseHandle(snapshot); return module_name_list; } int wmain(int argc, wchar_t* argv[]) { const auto list = ::getModuleList(); for(auto name : list) { std::wcout << name.c_str() << std::endl; } return 0; }
出力結果例
[System Process] System smss.exe csrss.exe wininit.exe ...
Visual Studio 2013にて動作確認済み
0 件のコメント:
コメントを投稿