PDH_STATUS PdhGetCounterInfo( IN HQUERY hCounter, IN BOOLEAN Explain, IN LPDWORD CounterInfoSize, IN PPDH_COUNTER_INFO CounterInfo);
引数の意味は以下のとおり。
hCounter | (IN) | 情報の取得元のカウンタのハンドル。 |
Explain | (IN) | カウンタの説明も取得するかどうかを表す真偽値。 |
CounterInfoSize | (IN/OUT) | CounterInfoのサイズ。関数の実行後、CounterInfoに設定されたデータのサイズまたは必要なデータのサイズが返される。 |
CounterInfo | (OUT) | 取得結果のカウンタの情報。CounterInfoSizeが0ならばNULLを設定可。 |
void DispCounterInfo() { HQUERY hQuery; HCOUNTER hCounter; PPDH_COUNTER_INFO pInfo; DWORD Size = 10000; pInfo = (PPDH_COUNTER_INFO)GlobalAlloc(GMEM_FIXED, 10000); /* 新規クエリーを作成 */ PdhOpenQuery(NULL, 0, &hQuery); /* 既に起動しているメモ帳のCPU使用率のカウンタをクエリーに追加 */ PdhAddCounter(hQuery, "\\Process(notepad#0)\\% Processor Time", 0, &hCounter); PdhGetCounterInfo( hCounter, TRUE, &Size, pInfo); printf("カウンタタイプ: 0x%08x\n", pInfo->dwType); switch(pInfo->dwType & 0x00000300) { case PERF_SIZE_DWORD: printf("\tDWORD長\n"); break; case PERF_SIZE_LARGE: printf("\tLARGE_INTEGER長\n"); break; case PERF_SIZE_ZERO: printf("\tゼロ長フィールド型\n"); break; case PERF_SIZE_VARIABLE_LEN: printf("\t可変長\n"); break; } switch(pInfo->dwType & 0x00000c00) { case PERF_TYPE_NUMBER: printf("\t数値型\n"); switch(pInfo->dwType & 0x000f0000) { case PERF_NUMBER_HEX: printf("\t16進数値での表示を推奨n"); break; case PERF_NUMBER_DECIMAL: printf("\t10進数値での表示を推奨\n"); break; case PERF_NUMBER_DEC_1000: printf("\t1/1000の10進数値で表示を推奨\n"); break; } break; case PERF_TYPE_COUNTER: printf("\tカウント型\n"); break; switch(pInfo->dwType & 0x000f0000) { case PERF_COUNTER_VALUE: printf("\tそのものがカウンタ\n"); break; case PERF_COUNTER_RATE: printf("\t二つのカウンタ値の差分を時間で割る\n"); break; case PERF_COUNTER_FRACTION: printf("\tPERF_COUNTER_FRACTION\n"); break; case PERF_COUNTER_BASE: printf("\tPERF_COUNTER_BASE\n"); break; case PERF_COUNTER_ELAPSED: printf("\tPERF_COUNTER_ELAPSED\n"); break; case PERF_COUNTER_QUEUELEN: printf("\tPERF_COUNTER_QUEUELEN\n"); break; case PERF_COUNTER_HISTOGRAM: printf("\tPERF_COUNTER_HISTOGRAM\n"); break; } case PERF_TYPE_TEXT: printf("文字列型\n"); break; switch(pInfo->dwType & 0x000f0000) { case PERF_TEXT_UNICODE: printf("\tPERF_TEXT_UNICODE\n"); break; case PERF_TEXT_ASCII: printf("\tPERF_TEXT_ASCII\n"); break; } case PERF_TYPE_ZERO: printf("ゼロ型\n"); break; } switch(pInfo->dwType & 0x00030000) { case PERF_TIMER_TICK: printf("\tPERF_TIMER_TICK\n"); break; case PERF_TIMER_100NS: printf("\tPERF_TIMER_100NS\n"); break; case PERF_OBJECT_TIMER: printf("\tPERF_OBJECT_TIMER\n"); break; } if(pInfo->dwType & PERF_DELTA_COUNTER) printf("\tPERF_DELTA_COUNTER\n"); if(pInfo->dwType & PERF_DELTA_BASE) printf("\tPERF_DELTA_BASE\n"); if(pInfo->dwType & PERF_INVERSE_COUNTER) printf("\tPERF_INVERSE_COUNTER\n"); if(pInfo->dwType & PERF_MULTI_COUNTER) printf("\tPERF_MULTI_COUNTER)\n"); switch(pInfo->dwType & 0xf0000000) { case PERF_DISPLAY_NO_SUFFIX: printf("\tPERF_DISPLAY_NO_SUFFIX\n"); break; case PERF_DISPLAY_PER_SEC: printf("\tPERF_DISPLAY_PER_SEC\n"); break; case PERF_DISPLAY_PERCENT: printf("\tPERF_DISPLAY_PERCENT\n"); break; case PERF_DISPLAY_SECONDS: printf("\tPERF_DISPLAY_SECONDS\n"); break; case PERF_DISPLAY_NOSHOW: printf("\tPERF_DISPLAY_NOSHOW\n"); break; } printf("バージョン: 0x%08x\n", pInfo->CVersion); printf("状態: 0x%08x\n", pInfo->CStatus); printf("現在のスケールファクタ: %d\n", pInfo->lScale); printf("デフォルトのスケールファクタ: %d\n", pInfo->lDefaultScale); printf("パス: %s\n", pInfo->szFullPath); printf("パスの構成要素:\n"); printf("\tマシン名: %s\n", pInfo->szMachineName); printf("\tオブジェクト名: %s\n", pInfo->szObjectName); printf("\t親インスタンス名: %s\n", pInfo->szParentInstance); printf("\tインデックス: %d\n", pInfo->dwInstanceIndex); printf("\tカウンタ名: %s\n", pInfo->szCounterName); printf("説明: %s\n", pInfo->szExplainText); /* 終了 */ GlobalFree(pInfo); PdhCloseQuery(hQuery); }