プロセスのメモリ情報を取得するにはGetProcessMemoryInfo()関数を利用します。(戻る)
- プロセスのハンドルを開く(OpenProcess)
- プロセスのメモリ情報を取得(GetProcessMemoryInfo)
- プロセスのハンドルを閉じる(CloseHandle)
取得可能なメモリ情報
- ページ・フォールト数(ページ フォルト)
- 現在ワーキングセット(メモリ使用量)
- 最大ワーキングセット(最大メモリ使用量)
- 現在ページプールの使用サイズ(ページ プール)
- 最大ページプールの使用サイズ
- 現在非ページプールの使用サイズ(非ページ プール)
- 最大非ページプールの使用サイズ
- 現在ページングファイルの使用サイズ(仮想メモリ サイズ)
- 最大ページングファイルの使用サイズ
※カッコ内はタスクマネージャでの表現です。
プロトタイプ宣言
HANDLE OpenProcess( DWORD dwDesiredAccess, // アクセス・フラグ BOOL bInheritHandle, // ハンドルの継承オプション DWORD dwProcessId // プロセス識別子 ); BOOL CloseHandle( HANDLE hObject // オブジェクトのハンドル ); BOOL GetProcessMemoryInfo( HANDLE Process, // プロセスのハンドル PPROCESS_MEMORY_COUNTERS ppsmemCounters, // 構造体のポインタ DWORD cb // 構造体のサイズ );
構造体
typedef struct _PROCESS_MEMORY_COUNTERS { DWORD cb; // 構造体のサイズ DWORD PageFaultCount; // ページ・フォールト数 SIZE_T PeakWorkingSetSize; // 最大ワーキングセット SIZE_T WorkingSetSize; // 現在ワーキングセット SIZE_T QuotaPeakPagedPoolUsage; // 最大ページプールの使用サイズ SIZE_T QuotaPagedPoolUsage; // 現在ページプールの使用サイズ SIZE_T QuotaPeakNonPagedPoolUsage; // 最大非ページプールの使用サイズ SIZE_T QuotaNonPagedPoolUsage; // 現在非ページプールの使用サイズ SIZE_T PagefileUsage; // 現在ページングファイルの使用サイズ SIZE_T PeakPagefileUsage; // 最大ページングファイルの使用サイズ } PROCESS_MEMORY_COUNTERS, *PPROCESS_MEMORY_COUNTERS;
サンプル
#include <stdio.h> #include <stdlib.h> #include <windows.h> #include <Psapi.h> // Psapi.Lib // マクロ関数 #define DISP_PARAM(n) (n), ((n) / 1024) // メイン関数 int main( int argc, char *argv[] ) { PROCESS_MEMORY_COUNTERS pmc = { 0 }; DWORD dwProcessID = GetCurrentProcessId(); HANDLE hProcess; if ( argc > 1 ){ dwProcessID = atoi( argv[1] ); } if ( (hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,dwProcessID)) != NULL ){ if ( GetProcessMemoryInfo(hProcess,&pmc,sizeof(pmc)) ){ printf( TEXT("プロセスID :%lu\n"), dwProcessID ); printf( TEXT("プロセス・ハンドル :0x%p\n"), hProcess ); printf( TEXT("ページフォールト数 :%10lu個\n"), pmc.PageFaultCount ); printf( TEXT("最大ワーキングセットのサイズ :%10luバイト(%lu KB)\n"), DISP_PARAM(pmc.PeakWorkingSetSize) ); printf( TEXT("現在ワーキングセットのサイズ :%10luバイト(%lu KB)\n"), DISP_PARAM(pmc.WorkingSetSize) ); printf( TEXT("最大ページプールの使用サイズ :%10luバイト(%lu KB)\n"), DISP_PARAM(pmc.QuotaPeakPagedPoolUsage) ); printf( TEXT("現在ページプールの使用サイズ :%10luバイト(%lu KB)\n"), DISP_PARAM(pmc.QuotaPagedPoolUsage) ); printf( TEXT("最大非ページプールの使用サイズ :%10luバイト(%lu KB)\n"), DISP_PARAM(pmc.QuotaPeakNonPagedPoolUsage) ); printf( TEXT("現在非ページプールの使用サイズ :%10luバイト(%lu KB)\n"), DISP_PARAM(pmc.QuotaNonPagedPoolUsage) ); printf( TEXT("最大ページングファイルの使用サイズ:%10luバイト(%lu KB)\n"), DISP_PARAM(pmc.PeakPagefileUsage) ); printf( TEXT("現在ページングファイルの使用サイズ:%10luバイト(%lu KB)\n"), DISP_PARAM(pmc.PagefileUsage) ); } else{ printf( TEXT("%lu:GetProcessMemoryInfo()関数のエラーです。\n"), GetLastError() ); } CloseHandle( hProcess ); return 0; } printf( TEXT("%lu:OpenProcess()関数のエラーです。\n"), GetLastError() ); return 1; }
- ヘッダファイルとしてPsapi.hをインクルードします。
- インポートライブラリとしてPsapi.Libをリンクします。
関連記事
- プロセスの時間情報を取得
- プロセスのハンドル数を取得
- プロセスのメモリ情報を取得
- プロセスのメモリ・ページ情報を取得
- プロセスのI/O操作情報を取得
- プロセスのGDI/USERオブジェクトを取得
- プロセスの最大/最小ワーキングセットを取得
- プロセスのワーキングセットを最小化
- プロセスのセッションIDを取得
- プロセスの優先順位クラスを取得
『ページフォールト数』についてですが,ページフォール
トが発生した回数を表しているか,と思います
つまり『~個』ではなくて,『~回』ではないでしょうか.
確かに『回数』でしょうから『~回』が正しそうですね。
指摘!ありがとうございます。