プロセス ID とプロセス・ハンドル
プロセス ID (DWORD 値) は、システム内でプロセスを識別するための固有の ID を表します。
プロセス・ハンドルは、対象のプロセスを Windows API 経由で操作するために指定します。 プロセス・ハンドルを取得すれば、そのプロセスを操作できることになります。 プロセス・ハンドルはシステム全体で一意でなく、取得したプロセス内でのみ有効です。
☝️ ワンポイント
プロセス・ハンドルは、プロセス ID とは違ってシステム全体で一意ではありません。
プロセス・ハンドルは、カーネルがプロセスごとに管理するハンドルテーブルへのインデックスです。
OpenProcess() を呼び出すと、カーネルは呼び出し元プロセスのハンドルテーブルに新しいエントリを作成し、そのインデックスをハンドル値として返します。
ハンドルテーブルはプロセスごとに独立しているため、同じ数値のハンドルが異なるプロセスでは別のリソースを指します。プロセス ID からプロセス・ハンドルを取得する
プロセス ID からプロセス・ハンドルを取得するには、OpenProcess 関数を使用します。
HANDLE OpenProcess(
DWORD dwDesiredAccess, // アクセスフラグ
BOOL bInheritHandle, // ハンドルの継承オプション
DWORD dwProcessId // プロセス識別子
);
HANDLE hProc = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcId);ハンドルが不要になったときは、CloseHandle 関数を使って閉じる必要があります。
BOOL CloseHandle(
HANDLE hObject // オブジェクトのハンドル
);
プロセス・ハンドルからプロセス ID を取得する
DWORD WINAPI GetProcessId(HANDLE Process);
ウィンドウ・ハンドルからプロセス ID を取得する
指定されたウィンドウを作成したスレッドの ID を取得します。
DWORD GetWindowThreadProcessId(
HWND hWnd, // ウィンドウのハンドル
LPDWORD lpdwProcessId // プロセス ID
);
現在のプロセス ID を取得する
この API を呼び出したプロセスの ID を取得します。
DWORD WINAPI GetCurrentProcessId(void);
プロセスが終了するまで待機する
あるプロセスが終了するまで待機するには、WaitForSingleObject() を使用します。
例えば、プロセス・ハンドルがシグナル状態になるまでずっと待機するには、下記のように実行します。
::WaitForSingleObject(hProcess, INFINITE);