PdhGetCounterInfo パフォーマンスカウンタの情報を取得

Cの宣言:

PDH_STATUS PdhGetCounterInfo(
	IN HQUERY hCounter,
	IN BOOLEAN Explain,
	IN LPDWORD CounterInfoSize,
	IN PPDH_COUNTER_INFO CounterInfo);

説明:

hCounterで指定したパフォーマンスカウンタの情報を取得し、CounterInfoに結果を格納する。

引数の意味は以下のとおり。
hCounter (IN) 情報の取得元のカウンタのハンドル。
Explain (IN) カウンタの説明も取得するかどうかを表す真偽値。
CounterInfoSize (IN/OUT) CounterInfoのサイズ。関数の実行後、CounterInfoに設定されたデータのサイズまたは必要なデータのサイズが返される。
CounterInfo (OUT) 取得結果のカウンタの情報。CounterInfoSizeが0ならばNULLを設定可。

Cのサンプル:

パフォーマンスカウンタの情報を取得・表示する。
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);
}

(original text:1999/02/02 更新)

本ドキュメントの内容は保証しません。本ドキュメントによって生じた結果について、一切の責任を負いません。