ログ ファイルからのパフォーマンス データの読み取り
次の例では、「パフォーマンス データをログ ファイルに書き込む」の例でログ ファイルに書き込まれたデータを 読み取ります。 PdhCollectQueryData 関数を使用してログ ファイルからデータを取得し、PdhGetFormattedCounterValue 関数を使用して表示するデータを書式設定します。
#include <windows.h>
#include <stdio.h>
#include <pdh.h>
#include <pdhmsg.h>
#pragma comment(lib, "pdh.lib")
CONST PWSTR COUNTER_PATH = L"\\Processor(0)\\% Processor Time";
void DisplayCommandLineHelp(void)
{
wprintf(L"The command line must contain a valid log file name.\n");
}
void wmain(int argc, WCHAR **argv)
{
HQUERY hQuery = NULL;
HCOUNTER hCounter = NULL;
PDH_STATUS status = ERROR_SUCCESS;
DWORD dwFormat = PDH_FMT_DOUBLE;
PDH_FMT_COUNTERVALUE ItemBuffer;
if (argc != 2)
{
DisplayCommandLineHelp();
goto cleanup;
}
// Opens the log file to write performance data
status = PdhOpenQuery(argv[1], 0, &hQuery);
if (ERROR_SUCCESS != status)
{
wprintf(L"PdhOpenQuery failed with 0x%x\n", status);
goto cleanup;
}
// Add the same counter used when writing the log file.
status = PdhAddCounter(hQuery, COUNTER_PATH, 0, &hCounter);
if (ERROR_SUCCESS != status)
{
wprintf(L"PdhAddCounter failed with 0x%x\n", status);
goto cleanup;
}
// Read a performance data record.
status = PdhCollectQueryData(hQuery);
if (ERROR_SUCCESS != status)
{
wprintf(L"PdhCollectQueryData failed with 0x%x\n", status);
goto cleanup;
}
while (ERROR_SUCCESS == status)
{
// Read the next record
status = PdhCollectQueryData(hQuery);
if (ERROR_SUCCESS == status)
{
// Format the performance data record.
status = PdhGetFormattedCounterValue(hCounter,
dwFormat,
(LPDWORD)NULL,
&ItemBuffer);
if (ERROR_SUCCESS != status)
{
wprintf(L"PdhGetFormattedCounterValue failed with 0x%x.\n", status);
goto cleanup;
}
wprintf(L"Formatted counter value = %.20g\n", ItemBuffer.doubleValue);
}
else
{
if (PDH_NO_MORE_DATA != status)
{
wprintf(L"PdhCollectQueryData failed with 0x%x\n", status);
}
}
}
cleanup:
// Close the query.
if (hQuery)
PdhCloseQuery(hQuery);
}