前々からの課題の一つに、JavaプログラムからWindows OS上の稼動プロセス一覧、それぞれのメモリ/CPU使用率を取り出す方法を見出すことがあります。OS固有の処理になるのでJNIを使うつもりです。
ところが、Win32 APIを調べまわっているのですが、なかなか簡単な方法が見つかりません。
CreateToolhelp32SnapshotとProcess32First/Process32Nextを使う
プロセス一覧は取れますが、CPU使用率、メモリサイズは取れないようです。
#include <windows.h> #include <tlhelp32.h> ... HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); PROCESSENTRY32 entry; entry.dwSize = sizeof(PROCESSENTRY32); if (Process32First(hSnapshot, &entry)) { do { // entry.szExeFile :プロセス名(実行ファイル名) // entry.th32ProcessID :プロセスID // entry.th32ParentProcessID :親プロセスID } while(Process32Next(hSnapshot, &entry));
PdhOpenQuery
使用方法が面倒そうです。
NtQuerySystemInformation
Windowsの悪名高い非公開APIのようです。ntdll.dllにコードが含まれますが、開発に必要なヘッダーやインポートライブラリは見当たらなかったので、どうビルドするのか不明です。どうやら自前でヘッダーファイルを作り、インポートライブラリはdumpbinコマンドあたりで生成する?
- Microsoft SDKのwinternl.hに以下の定義がありました
- NtQuerySystemInformation関数のプロトタイプ宣言
- SYSTEM_PROCESS_INFORMATION(*PSYSTEM_PROCESS_INFORMATION)構造体定義
- 関数の呼び出しは、LoadLibraryでntdll.dllをロードし、GetProcAddressでNtQuerySystemInformation関数のポインタを取得し呼び出す