Windows NT 4.0 以降でプロセスのフルパス名を列挙するには次のようにします。(戻る)
- プロセスIDの列挙(EnumProcesses)
- プロセスIDからプロセス・ハンドルの取得(OpenProcess)
- プロセス・ハンドルからモジュールの列挙(EnumProcessModules)
- モジュール・ハンドルからフルパスの取得(GetModuleFileNameEx)
- プロセス・ハンドルを閉じる(CloseHandle)
プロトタイプ宣言
HANDLE OpenProcess( DWORD dwDesiredAccess, // アクセス方法のフラグ BOOL bInheritHandle, // ハンドルの継承オプション DWORD dwProcessId // プロセス識別子 ); BOOL CloseHandle( HANDLE hObject // オブジェクトのハンドル ); BOOL EnumProcesses( DWORD *lpidProcess, // プロセス識別子の配列 DWORD cb, // プロセス識別子の配列サイズ DWORD *cbNeeded // 返されたバイト数 ); BOOL EnumProcessModules( HANDLE hProcess, // プロセスのハンドル HMODULE *lphModule, // モジュールハンドルの配列 DWORD cb, // モジュールハンドルの配列サイズ LPDWORD lpcbNeeded // 返されたバイト数 ); DWORD GetModuleFileNameEx( HANDLE hProcess, // プロセスのハンドル HMODULE hModule, // モジュールのハンドル LPTSTR lpFilename, // バッファ領域 DWORD nSize // バッファ領域のサイズ );
サンプル
#include <stdio.h> #include <windows.h> #include <psapi.h> // Psapi.Lib // このファイルで使用する定数 #define OPEN_PROCESS (PROCESS_QUERY_INFORMATION | PROCESS_VM_READ) // メイン関数 int main( void ) { DWORD ProcessID[ 1024 ]; DWORD dwSize; DWORD dwMax; DWORD dwNow; HANDLE hProcess; // プロセス識別子の取得 EnumProcesses( ProcessID, sizeof(ProcessID), &dwSize ); dwMax = (dwSize / sizeof(DWORD)); // プロセス識別子からプロセス名を列挙 for ( dwNow = 0 ; dwNow < dwMax ; dwNow++ ){ TCHAR szFile[ 1024 ] = { 0 }; HMODULE Module[ 1024 ] = { 0 }; // プロセスのフルパス名を取得 if ( (hProcess = OpenProcess(OPEN_PROCESS,FALSE,ProcessID[dwNow])) != NULL ){ if ( EnumProcessModules(hProcess,Module,sizeof(Module),&dwSize) ){ GetModuleFileNameEx( hProcess, Module[0], szFile, sizeof(szFile) ); } CloseHandle( hProcess ); } printf( "%3d: %08X [%s]\n", (dwNow + 1), ProcessID[dwNow], szFile ); } return 0; }
- ヘッダファイルとしてpsapi.hをインクルードして下さい。
- インポートライブラリとしてPsapi.Libをリンクして下さい。
プロトタイプ宣言はいらないのでは?
プロトタイプ宣言はAPI関数の引数を簡単に説明するために載せています。
コピー&ペーストして利用するときは #include <stdio.h> の行より下です。
あとHSP用に関数や構造体の内容を載せています。(定数までは載せていませんが…)
わざわざコメントありがとうございました。
ブログを汚してしまってすいません。
不要であればコメントを消してください。
DWORD配列で確定するBYTE領域サイズなのでは?
その通りです。
だから第2引数には sizeof(ProcessID) と記述してますよ。
また、読み込めたバイト数が第3引数にセットされます。
この第3引数の dwSize ÷ sizeof(DWORD) = 個数となります。
特に記述は間違ってないよね。
なぜ。
疑問符が付いているの?
確認なのか。