2012年10月28日日曜日

[Win][C++]現在起動しているプロセス名を列挙する方法

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 件のコメント:

コメントを投稿