プログラミングのメモ帳(C/C++/HSP)

日々のプログラミングで気づいた点や小技集を紹介します。(Windows 10/XP/Vista、VC2017、HSP)

プロセスの時間情報を取得

2008年07月04日 11時25分00秒 | プロセス関連

プロセスに関する時間情報を取得するには GetProcessTimes() 関数を利用します。(戻る)

  1. プロセスのハンドルを開く(OpenProcess)
  2. プロセスの時間情報を取得(GetProcessTimes)
  3. 世界協定時刻からローカル時間に変換(FileTimeToLocalFileTime)
  4. ファイル時刻からシステム時間に変換(FileTimeToSystemTime)
  5. プロセスのハンドルを閉じる(CloseHandle)

プロセスを開くときに PROCESS_QUERY_INFORMATION アクセス権を割り当てる必要があります。

取得可能な時間情報

  1. プロセスの作成時刻
  2. プロセスの終了時刻
  3. プロセスのカーネルモード動作時間
  4. プロセスのユーザーモード動作時間

時間情報はすべて 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 <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <Psapi.h>      // 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, &ltTime );
    }
    else{
        ltTime = *ftTime;
    }
    FileTimeToSystemTime( &ltTime, &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 をリンクします。

関連記事



コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« プロセスの優先順位クラスを取得 | トップ | プロセスのGDI/USERオブジェ... »
最新の画像もっと見る

コメントを投稿

プロセス関連」カテゴリの最新記事