Exemple #1
0
/**
 * カウンタハンドル作成し、登録します。
 *
 * @param pszInstanceName インスタンス名
 * @param pszCounterName カウンタ名
 * @param hCounter カウンタハンドル格納先
 * @return カウンタハンドルの登録に成功した場合は true 、失敗した場合は false
 */
static
bool AddCounter( LPTSTR pszInstanceName, LPTSTR pszCounterName, PDH_HCOUNTER &hCounter )
{
	// 入力チェック
	if( NULL == pszInstanceName || NULL == pszCounterName )
	{
		assert( !"入力エラー" );
		return false;
	}

	// カウンターパスの作成
	TCHAR szCounterPath[COUNTER_PATH_SIZE];
	if( !MakeCounterPath( pszInstanceName, pszCounterName, szCounterPath, COUNTER_PATH_SIZE ) )
	{
		return false;
	}

	// 作成したカウンターパスを要求ハンドルに登録。カウンターハンドルを得ておく。
	if( ERROR_SUCCESS != PdhAddCounter( hQuery, szCounterPath, 0, &hCounter ) )
	{
		return false;
	}

	return true;
}
Exemple #2
0
bool
GetPdhCounterValue(LPTSTR	pszInstanceName,	// インスタンス名
	LPTSTR	pszCounterName,		// カウンター名
	DWORD	dwFormat,			// 受け取る値の型の種類
	void*	pValue,				// 値受け取りバッファー
	DWORD	dwValueSize,		// 値受け取りバッファーのサイズ(byte)
	DWORD	dwSleepMilliSecond = 0)	// [in]値受け取り時にスリープをするか
{
	// 入力チェック
	if (NULL == pszInstanceName
		|| NULL == pszCounterName
		|| NULL == pValue
		|| 0 == dwValueSize)
	{
		//assert( !"入力エラー" );
		return false;
	}

	bool		bResult = false;		// 結果

	HQUERY		hQuery = NULL;		// 要求ハンドル
	HCOUNTER	hCounter = NULL;	// カウンターハンドル

									// カウンターパスの作成
	TCHAR szCounterPath[1024];
	if (1 != MakeCounterPath(pszInstanceName, pszCounterName, szCounterPath, 1024))
	{
		goto LABEL_END;
	}

	// 要求ハンドルの作成
	if (ERROR_SUCCESS != PdhOpenQuery(NULL,
		0,
		&hQuery))	// 要求ハンドル
	{
		goto LABEL_END;
	}

	// 作成したカウンターパスを要求ハンドルに登録。カウンターハンドルを得ておく。
	if (ERROR_SUCCESS != PdhAddCounter(hQuery,			// 要求ハンドル
		szCounterPath,
		0,
		&hCounter))	// カウンターハンドル
	{
		goto LABEL_END;
	}

	// 要求データの取得
	if (ERROR_SUCCESS != PdhCollectQueryData(hQuery))
	{
		goto LABEL_END;
	}
	if (0 < dwSleepMilliSecond)
	{
		Sleep(dwSleepMilliSecond);
		if (ERROR_SUCCESS != PdhCollectQueryData(hQuery))
		{
			goto LABEL_END;
		}
	}

LABEL_END:
	PDH_FMT_COUNTERVALUE	fmtValue;

	PdhGetFormattedCounterValue(hCounter, dwFormat, NULL, &fmtValue);

	bResult = true;

	PdhRemoveCounter(hCounter);
	PdhCloseQuery(hQuery);
	if (false == bResult)
	{	// 失敗
		//assert( !"失敗" );
		return false;
	}

	// 成功
	switch (dwFormat)
	{
	case PDH_FMT_LONG:
		if (dwValueSize != sizeof(LONG))
		{
			//assert( !"受け取る値の型の種類に対して値受け取りバッファーのサイズが不正" );
			return false;
		}
		else
		{
			LONG* plValue = (LONG*)pValue;
			*plValue = fmtValue.longValue;
		}
		break;
	case PDH_FMT_DOUBLE:
		if (dwValueSize != sizeof(double))
		{
			//assert( !"受け取る値の型の種類に対して値受け取りバッファーのサイズが不正" );
			return false;
		}
		else
		{
			double* pdValue = (double*)pValue;
			*pdValue = fmtValue.doubleValue;

		}
		break;
	case PDH_FMT_ANSI:
	case PDH_FMT_UNICODE:
	case PDH_FMT_LARGE:
	default:
		//assert( !"未対応" );
		return false;
	}
	return true;
}
Exemple #3
0
/**
 * PDHカウンター値を取得します。
 *
 * @param pszInstanceName インスタンス名
 * @param pszCounterName パフォーマンスカウンタ名
 * @param dwFormat 取得する値のフォーマット(PDH_FMT_*)
 * @param pValue 値格納先
 * @param dwValueSize 値の格納可能サイズ
 * @param dwSleepMilliSecond 0 より大きな値を指定した場合、値を2回取得し、2回目の値を返す
 * @return 値を取得できた場合は true 、取得できなかった場合は false
 */
static
bool GetPdhCounterValue( LPTSTR pszInstanceName, LPTSTR pszCounterName, DWORD dwFormat, void* pValue, DWORD dwValueSize, DWORD dwSleepMilliSecond = 0 )
{
	// 入力チェック
	if( NULL == pszInstanceName
	 || NULL == pszCounterName
	 || NULL == pValue
	 || 0 == dwValueSize )
	{
		assert( !"入力エラー" );
		return false;
	}

	bool		bResult = false;		// 結果

	HQUERY		hQuery = NULL;		// 要求ハンドル
	HCOUNTER	hCounter = NULL;	// カウンターハンドル
	

  // カウンターパスの作成
	TCHAR szCounterPath[COUNTER_PATH_SIZE];
	if( !MakeCounterPath( pszInstanceName, pszCounterName, szCounterPath, COUNTER_PATH_SIZE ) )
	{
		goto LABEL_END;
	}

	// 要求ハンドルの作成
	if( ERROR_SUCCESS != PdhOpenQuery( NULL, 0, &hQuery ) )
	{
		goto LABEL_END;
	}

	// 作成したカウンターパスを要求ハンドルに登録。カウンターハンドルを得ておく。
	if( ERROR_SUCCESS != PdhAddCounter( hQuery, szCounterPath, 0, &hCounter ) )
	{
		goto LABEL_END;
	}

	// 要求データの取得
	DWORD dwErrorCode = PdhCollectQueryData( hQuery );
	if( ERROR_SUCCESS !=  dwErrorCode)
	{
		goto LABEL_END;
	}
	if( 0 < dwSleepMilliSecond )
	{
		Sleep( dwSleepMilliSecond );
		if( ERROR_SUCCESS != PdhCollectQueryData( hQuery ) )
		{
			goto LABEL_END;
		}
	}

	PDH_FMT_COUNTERVALUE	fmtValue;
	PdhGetFormattedCounterValue( hCounter, dwFormat, NULL, &fmtValue );

	bResult = true;

LABEL_END:
	PdhRemoveCounter( hCounter );
	PdhCloseQuery( hQuery );
	if( false == bResult )
	{	// 失敗
		return false;
	}

	// 成功
	switch( dwFormat )
	{
		case PDH_FMT_LONG:
			if( dwValueSize != sizeof(LONG) )
			{
				assert( !"受け取る値の型の種類に対して値受け取りバッファーのサイズが不正" );
				return false;
			}
			else
			{
				// pValueが示すアドレスにLONG値を格納する
				LONG* plValue = (LONG*)pValue;
				*plValue = fmtValue.longValue;
			}
			break;
		case PDH_FMT_DOUBLE:
			if( dwValueSize != sizeof(double) )
			{
				assert( !"受け取る値の型の種類に対して値受け取りバッファーのサイズが不正" );
				return false;
			}
			else
			{
				// pValueが示すアドレスにdouble値を格納する
				double* pdValue = (double*)pValue;
				*pdValue = fmtValue.doubleValue;
			}
			break;
		case PDH_FMT_ANSI:
		case PDH_FMT_UNICODE:
		case PDH_FMT_LARGE:
		default:
			assert( !"未対応" );
			return false;
	}
	return true;
}