◆プロセスの時間情報を取得
2008年07月04日 11時25分00秒 | プロセス関連
プロセスに関する時間情報を取得するには GetProcessTimes() 関数を利用します。(戻る)
プロセスのハンドルを開く(OpenProcess)
プロセスの時間情報を取得(GetProcessTimes)
世界協定時刻からローカル時間に変換(FileTimeToLocalFileTime)
ファイル時刻からシステム時間に変換(FileTimeToSystemTime)
プロセスのハンドルを閉じる(CloseHandle)
プロセスを開くときに PROCESS_QUERY_INFORMATION アクセス権を割り当てる必要があります。
取得可能な時間情報
プロセスの作成時刻
プロセスの終了時刻
プロセスのカーネルモード動作時間
プロセスのユーザーモード動作時間
時間情報はすべて FILETIME 構造体に格納されます。
プロトタイプ宣言
HANDLE OpenProcess(
DWORD dwDesiredAccess, // アクセス・フラグ
BOOL bInheritHandle, // ハンドルの継承オプション
DWORD dwProcessId // プロセス識別子
);
BOOL CloseHandle(
HANDLE hObject // オブジェクトのハンドル
);
BOOL GetProcessTimes(
HANDLE hProcess, // プロセスのハンドル
LPFILETIME lpCreationTime, // プロセスの作成時刻
LPFILETIME lpExitTime, // プロセスの終了時刻
LPFILETIME lpKernelTime, // プロセスのカーネルモードでの動作時間
LPFILETIME lpUserTime // プロセスのユーザーモードでの動作時間
);
BOOL FileTimeToLocalFileTime(
CONST FILETIME* lpFileTime, // 変更前の世界協定時刻(UTC)
LPFILETIME lpLocalFileTime // 変換後のファイル時刻
);
BOOL FileTimeToSystemTime(
CONST FILETIME* lpFileTime, // 変更前のファイル時刻
LPSYSTEMTIME lpSystemTime // 変更後のシステム日時
);
構造体
typedef struct _FILETIME {
DWORD dwLowDateTime; // ファイル時刻の下位32ビット
DWORD dwHighDateTime; // ファイル時刻の上位32ビット
} FILETIME, *LPFILETIME;
typedef struct _SYSTEMTIME {
WORD wYear; // 年
WORD wMonth; // 月
WORD wDayOfWeek; // 曜日
WORD wDay; // 日
WORD wHour; // 時
WORD wMinute; // 分
WORD wSecond; // 秒
WORD wMilliseconds; // ミリ秒(1/1000)
} SYSTEMTIME, *LPSYSTEMTIME;
共用体
typedef union _ULARGE_INTEGER {
struct {
DWORD LowPart; // 符号なしの32ビット整数(下位)
DWORD HighPart; // 符号なしの32ビット整数(上位)
} u;
ULONGLONG QuadPart; // 符号なしの64ビット整数
} ULARGE_INTEGER, *LPULARGE_INTEGER;
サンプル
#include
#include
#include
#include // Psapi.Lib
// ファイル時間から64ビット整数に変換
static ULONGLONG getTimeInt64( LPFILETIME ftTime )
{
ULARGE_INTEGER u64Time;
u64Time.u.LowPart = ftTime->dwLowDateTime;
u64Time.u.HighPart = ftTime->dwHighDateTime;
return u64Time.QuadPart;
}
// ファイル時間の加算
static LPFILETIME addFileTime( LPFILETIME ftTime1, LPFILETIME ftTime2 )
{
static FILETIME ftTime;
ULARGE_INTEGER u64Time1;
ULARGE_INTEGER u64Time2;
// 1セット
u64Time1.u.LowPart = ftTime1->dwLowDateTime;
u64Time1.u.HighPart = ftTime1->dwHighDateTime;
// 2セット
u64Time2.u.LowPart = ftTime2->dwLowDateTime;
u64Time2.u.HighPart = ftTime2->dwHighDateTime;
// 加算
u64Time1.QuadPart += u64Time2.QuadPart;
// 変換
ftTime.dwLowDateTime = u64Time1.u.LowPart;
ftTime.dwHighDateTime = u64Time1.u.HighPart;
return &ftTime;
}
// ファイル時間から時間文字列に変換
static LPCTSTR getTimeString( LPTSTR lpBuff, LPFILETIME ftTime, BOOL bLocalTime )
{
FILETIME ltTime;
SYSTEMTIME stTime;
if ( bLocalTime ){
FileTimeToLocalFileTime( ftTime, <Time );
}
else{
ltTime = *ftTime;
}
FileTimeToSystemTime( <Time, &stTime );
wsprintf( lpBuff, TEXT("%04d/%02d/%02d(%.2s) %02d:%02d:%02d.%03d秒(%I64u)"),
stTime.wYear,
stTime.wMonth,
stTime.wDay,
&TEXT("日月火水木金土")[ stTime.wDayOfWeek * 2 ],
stTime.wHour,
stTime.wMinute,
stTime.wSecond,
stTime.wMilliseconds,
getTimeInt64(ftTime)
);
return lpBuff;
}
// メイン関数
int main( int argc, char *argv[] )
{
TCHAR szBuff[ 1024 ];
DWORD dwProcessID = GetCurrentProcessId();
HANDLE hProcess;
FILETIME ftMakeTime; // プロセスの作成時刻
FILETIME ftExitTime; // プロセスの終了時刻
FILETIME ftKernTime; // プロセスのカーネル動作時間
FILETIME ftUserTime; // プロセスのユーザー動作時間
if ( argc > 1 ){
dwProcessID = atoi( argv[1] );
}
if ( (hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,dwProcessID)) != NULL ){
if ( GetProcessTimes(hProcess,&ftMakeTime,&ftExitTime,&ftKernTime,&ftUserTime) ){
printf( TEXT("プロセスID :%lu\n"), dwProcessID );
printf( TEXT("プロセス・ハンドル :0x%p\n"), hProcess );
printf( TEXT("プロセスの作成時刻 :%s\n"), getTimeString(szBuff,&ftMakeTime,TRUE) );
printf( TEXT("プロセスの終了時刻 :%s\n"), getTimeString(szBuff,&ftExitTime,TRUE) );
printf( TEXT("プロセスのカーネル動作時間:%s\n"), getTimeString(szBuff,&ftKernTime,FALSE) );
printf( TEXT("プロセスのユーザー動作時間:%s\n"), getTimeString(szBuff,&ftUserTime,FALSE) );
printf( TEXT("プロセスのトータル動作時間:%s\n"), getTimeString(szBuff,addFileTime(&ftKernTime,&ftUserTime),FALSE) );
}
else{
printf( TEXT("%lu:GetProcessTimes()関数のエラーです。\n"), GetLastError() );
}
CloseHandle( hProcess );
return 0;
}
printf( TEXT("%lu:OpenProcess()関数のエラーです。\n"), GetLastError() );
return 1;
}
ヘッダファイルとして Psapi.h をインクルードします。
インポートライブラリとして Psapi.Lib をリンクします。
◆プロセスのハンドル数を取得
2008年07月06日 13時32分00秒 | プロセス関連
プロセスのハンドル数を取得するにはGetProcessHandleCount()関数を利用します。(戻る)
プロセスのハンドルを開く(OpenProcess)
プロセスのハンドル数を取得(GetProcessHandleCount)
プロセスのハンドルを閉じる(CloseHandle)
プロセスを開くときにPROCESS_QUERY_INFORMATIONアクセス権を割り当てる必要があります。
プロトタイプ宣言
HANDLE OpenProcess(
DWORD dwDesiredAccess, // アクセス・フラグ
BOOL bInheritHandle, // ハンドルの継承オプション
DWORD dwProcessId // プロセス識別子
);
BOOL CloseHandle(
HANDLE hObject // オブジェクトのハンドル
);
BOOL GetProcessHandleCount(
HANDLE hProcess, // プロセスのハンドル
PDWORD pdwHandleCount // ハンドル数へのポインタ
);
サンプル
#define _WIN32_WINNT (0x0501) // GetProcessHandleCount()
#include
#include
#include
// メイン関数
int main( int argc, char *argv[] )
{
DWORD dwProcessID = GetCurrentProcessId();
HANDLE hProcess;
DWORD dwHandle;
if ( argc > 1 ){
dwProcessID = atoi( argv[1] );
}
if ( (hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,dwProcessID)) != NULL ){
if ( GetProcessHandleCount(hProcess,&dwHandle) ){
printf( TEXT("プロセスID:%lu\n"), dwProcessID );
printf( TEXT("ハンドル数:%lu個\n"), dwHandle );
}
else{
printf( TEXT("%lu:GetProcessHandleCount()関数のエラーです。\n"), GetLastError() );
}
CloseHandle( hProcess );
return 0;
}
printf( TEXT("%lu:OpenProcess()関数のエラーです。\n"), GetLastError() );
return 1;
}
GetProcessHandleCount()関数はWindows 2000以降でサポートされました。
それ以前のバージョンでは利用できません。
◆プロセスのメモリ情報を取得
2008年07月07日 15時55分00秒 | プロセス関連
プロセスのメモリ情報を取得するには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
#include
#include
#include // 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をリンクします。
◆プロセスのメモリ・ページ情報を取得
2008年07月15日 10時50分00秒 | プロセス関連
プロセスのワーキングセット内のメモリ・ページ情報を取得します。
取得するにはQueryWorkingSet()関数を利用します。(戻る)
プロセスのハンドルを開く(OpenProcess)
プロセスのメモリ・ページ情報を取得(QueryWorkingSet)
プロセスのハンドルを閉じる(CloseHandle)
プロセスを開くときにPROCESS_QUERY_INFORMATIONアクセス権を割り当てる必要があります。
バッファ内容について
DWORD型の最初の要素は、有効なメモリ・ページ情報の個数
DWORD型の2番目からは、有効なメモリ・ページ情報の配列
メモリ・ページ情報の構造
上位20ビットがメモリ・ページのアドレスを保持
下位12ビットはメモリ・ページのフラグ情報
フラグ情報の意味
0x001:このページは読み取り専用
0x002:このページは実行可能
0x004:このページは読み書き可能
0x005:このページは書き込み時コピー
0x100:このページは共有アクセス可能(複数のプロセス間での共有)
0x001、0x004、0x005はどれか1つの状態です。
プロトタイプ宣言
HANDLE OpenProcess(
DWORD dwDesiredAccess, // アクセス・フラグ
BOOL bInheritHandle, // ハンドルの継承オプション
DWORD dwProcessId // プロセス識別子
);
BOOL CloseHandle(
HANDLE hObject // オブジェクトのハンドル
);
BOOL QueryWorkingSet(
HANDLE hProcess, // プロセスのハンドル
PVOID pv, // 情報を受け取るバッファ
DWORD cb // バッファのサイズ
);
サンプル
#include
#include
#include
#include // Psapi.Lib
// break付きのキーワード
#define CASE break;case
#define DEFAULT break;default
// メイン関数
int main( int argc, char *argv[] )
{
DWORD dwQuery[ 1024 ];
DWORD dwProcessID = GetCurrentProcessId();
HANDLE hProcess;
if ( argc > 1 ){
dwProcessID = atoi( argv[1] );
}
if ( (hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,dwProcessID)) != NULL ){
if ( QueryWorkingSet(hProcess,dwQuery,sizeof(dwQuery)) ){
LPDWORD lpData = &dwQuery[1];
LPDWORD lpStop = &dwQuery[1] + dwQuery[0];
while ( lpData < lpStop ){
DWORD dwAddress = (*lpData & 0xFFFFF000); // 上位20Bit
DWORD dwAttrib = (*lpData & 0x00000FFF); // 下位12Bit
printf( TEXT("0x%08X(0x%03X)⇒0x%08Xアドレスのページは、"), *lpData, dwAttrib, dwAddress );
switch ( dwAttrib & 0x005 ){
CASE 0x001: printf( TEXT("読み取り専用") );
CASE 0x004: printf( TEXT("読み書き") );
CASE 0x005: printf( TEXT("読み書き時コピー") );
DEFAULT: printf( TEXT("不明") );
}
if ( dwAttrib & 0x002 ){
printf( TEXT("、実行可能") );
}
if ( dwAttrib & 0x100 ){
printf( TEXT("、共有アクセス可能") );
}
else{
printf( TEXT("、アクセス可能") );
}
printf( TEXT("です。\n") );
lpData++;
}
}
else{
printf( TEXT("%lu:QueryWorkingSet()関数のエラーです。\n"), GetLastError() );
}
CloseHandle( hProcess );
return 0;
}
printf( TEXT("%lu:OpenProcess()関数のエラーです。\n"), GetLastError() );
return 1;
}
ヘッダファイルとしてPsapi.hをインクルードします。
インポートライブラリとしてPsapi.Libをリンクします。
◆プロセスの最大/最小ワーキングセットを取得
2008年07月11日 15時22分00秒 | プロセス関連
プロセスの最大/最小ワーキングセットを取得するにはGetProcessWorkingSetSize()関数を利用します。
プロセスの『ワーキングセット』とは、プロセスが利用しているメモリでページ・フォールトを起こさずに常に使える物理メモリのことです。
詳しくはMSDNサイトや仮想メモリ、メモリページで独自に調べてみて下さい。(戻る)
プロセスのハンドルを開く(OpenProcess)
プロセスの優先順位クラスを取得(GetProcessWorkingSetSize)
プロセスのハンドルを閉じる(CloseHandle)
プロセスを開くときにPROCESS_QUERY_INFORMATIONアクセス権を割り当てる必要があります。
プロトタイプ宣言
HANDLE OpenProcess(
DWORD dwDesiredAccess, // アクセス・フラグ
BOOL bInheritHandle, // ハンドルの継承オプション
DWORD dwProcessId // プロセス識別子
);
BOOL CloseHandle(
HANDLE hObject // オブジェクトのハンドル
);
BOOL GetProcessWorkingSetSize(
HANDLE hProcess, // プロセスのハンドル
LPDWORD lpMinimumWorkingSetSize, // 最小ワーキングセットへのポインタ
LPDWORD lpMaximumWorkingSetSize // 最大ワーキングセットへのポインタ
);
サンプル
#include
#include
#include
// メイン関数
int main( int argc, char *argv[] )
{
HANDLE hProcess;
DWORD dwProcessID = GetCurrentProcessId();
DWORD dwMin;
DWORD dwMax;
if ( argc > 1 ){
dwProcessID = atoi( argv[1] );
}
if ( (hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,dwProcessID)) != NULL ){
if ( GetProcessWorkingSetSize(hProcess,&dwMin,&dwMax) ){
printf( TEXT("プロセスID :%lu\n"), dwProcessID );
printf( TEXT("プロセス・ハンドル :0x%p\n"), hProcess );
printf( TEXT("最小のワーキングセットサイズ:%10luバイト(%lu KB)\n"), dwMin, (dwMin / 1024) );
printf( TEXT("最大のワーキングセットサイズ:%10luバイト(%lu KB)\n"), dwMax, (dwMax / 1024) );
}
else{
printf( TEXT("%lu:GetProcessWorkingSetSize()関数のエラーです。\n"), GetLastError() );
}
CloseHandle( hProcess );
return 0;
}
printf( TEXT("%lu:OpenProcess()関数のエラーです。\n"), GetLastError() );
return 1;
}
プロセスの最大/最小ワーキングセットはSetProcessWorkingSetSize()関数で設定することが出来ます。
◆プロセスのワーキングセットを最小化
2008年07月12日 20時52分00秒 | プロセス関連
プロセスのワーキングセットをできるだけ減らして最小化します。
最小化するにはEmptyWorkingSet()関数、またはSetProcessWorkingSetSize()関数を利用します。(戻る)
プロセスのハンドルを開く(OpenProcess)
プロセスのワーキングセットを最小化(EmptyWorkingSet)
プロセスのハンドルを閉じる(CloseHandle)
プロセスを開くときにPROCESS_QUERY_INFORMATIONとPROCESS_SET_QUOTAの2つのアクセス権を割り当てる必要があります。
プロトタイプ宣言
HANDLE OpenProcess(
DWORD dwDesiredAccess, // アクセス・フラグ
BOOL bInheritHandle, // ハンドルの継承オプション
DWORD dwProcessId // プロセス識別子
);
BOOL CloseHandle(
HANDLE hObject // オブジェクトのハンドル
);
BOOL EmptyWorkingSet(
HANDLE hProcess // プロセスのハンドル
);
サンプル
#include
#include
#include
#include // Psapi.Lib
// メイン関数
int main( int argc, char *argv[] )
{
DWORD dwAccess = (PROCESS_QUERY_INFORMATION | PROCESS_SET_QUOTA);
DWORD dwProcessID = GetCurrentProcessId();
HANDLE hProcess;
if ( argc > 1 ){
dwProcessID = atoi( argv[1] );
}
if ( (hProcess = OpenProcess(dwAccess,FALSE,dwProcessID)) != NULL ){
// if ( SetProcessWorkingSetSize(hProcess,0xFFFFFFFF,0xFFFFFFFF) ){
if ( EmptyWorkingSet(hProcess) ){
printf( TEXT("指定プロセスのワーキングセットを最小化しました。\n") );
}
else{
printf( TEXT("%lu:EmptyWorkingSet()関数のエラーです。\n"), GetLastError() );
}
CloseHandle( hProcess );
return 0;
}
printf( TEXT("%lu:OpenProcess()関数のエラーです。\n"), GetLastError() );
return 1;
}
ヘッダファイルとしてPsapi.hをインクルードします。
インポートライブラリとしてPsapi.Libをリンクします。
不必要にプロセスのワーニングセットを最小化するとパフォーマンスが低下することがあります。
◆プロセスの優先順位クラスを取得
2008年07月03日 10時26分00秒 | プロセス関連
プロセスの優先順位クラスを取得するにはGetPriorityClass()関数を利用します。(戻る)
プロセスのハンドルを開く(OpenProcess)
プロセスの優先順位クラスを取得(GetPriorityClass)
プロセスのハンドルを閉じる(CloseHandle)
プロセスを開くときにPROCESS_QUERY_INFORMATIONアクセス権を割り当てる必要があります。
定数
定数 意味
REALTIME_PRIORITY_CLASS リアルタイム(R)
HIGH_PRIORITY_CLASS 高(H)
ABOVE_NORMAL_PRIORITY_CLASS 通常以上(A)
NORMAL_PRIORITY_CLASS 通常(N)
BELOW_NORMAL_PRIORITY_CLASS 通常以下(B)
IDLE_PRIORITY_CLASS 底(L)
日本語の表記はタスクマネージャの『優先度の設定(P)』と同じにしています。
プロトタイプ宣言
HANDLE OpenProcess(
DWORD dwDesiredAccess, // アクセス・フラグ
BOOL bInheritHandle, // ハンドルの継承オプション
DWORD dwProcessId // プロセス識別子
);
BOOL CloseHandle(
HANDLE hObject // オブジェクトのハンドル
);
DWORD GetPriorityClass(
HANDLE hProcess // プロセスのハンドル
);
サンプル
#include
#include
#include
// break付きのキーワード
#define CASE break;case
#define DEFAULT break;default
// メイン関数
int main( int argc, char *argv[] )
{
DWORD dwProcessID = GetCurrentProcessId();
HANDLE hProcess;
LPTSTR lpMsg;
if ( argc > 1 ){
dwProcessID = atoi( argv[1] );
}
if ( (hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,dwProcessID)) != NULL ){
switch ( GetPriorityClass(hProcess) ){
CASE REALTIME_PRIORITY_CLASS: lpMsg = TEXT("REALTIME_PRIORITY_CLASS『リアルタイム(R)』");
CASE HIGH_PRIORITY_CLASS: lpMsg = TEXT("HIGH_PRIORITY_CLASS『高(H)』");
CASE ABOVE_NORMAL_PRIORITY_CLASS: lpMsg = TEXT("ABOVE_NORMAL_PRIORITY_CLASS『通常以上(A)』");
CASE NORMAL_PRIORITY_CLASS: lpMsg = TEXT("NORMAL_PRIORITY_CLASS『通常(N)』");
CASE BELOW_NORMAL_PRIORITY_CLASS: lpMsg = TEXT("BELOW_NORMAL_PRIORITY_CLASS『通常以下(B)』");
CASE IDLE_PRIORITY_CLASS: lpMsg = TEXT("IDLE_PRIORITY_CLASS『底(L)』");
DEFAULT: lpMsg = TEXT("open error");
}
printf( TEXT("プロセスID :%lu\n"), dwProcessID );
printf( TEXT("プロセス・ハンドル:0x%p\n"), hProcess );
printf( TEXT("プロセスの優先順位:%s\n"), lpMsg );
CloseHandle( hProcess );
return 0;
}
printf( TEXT("%lu:OpenProcess()関数のエラーです。\n"), GetLastError() );
return 1;
}