다음을 통해 공유


PdhGetFormattedCounterArrayA 함수(pdh.h)

서식이 지정된 카운터 값의 배열을 반환합니다. instance 이름의 와일드카드 문자가 포함된 카운터의 카운터 값에 서식을 지정하려면 이 함수를 사용합니다.

구문

PDH_FUNCTION PdhGetFormattedCounterArrayA(
  [in]      PDH_HCOUNTER                 hCounter,
  [in]      DWORD                        dwFormat,
  [in, out] LPDWORD                      lpdwBufferSize,
  [out]     LPDWORD                      lpdwItemCount,
  [out]     PPDH_FMT_COUNTERVALUE_ITEM_A ItemBuffer
);

매개 변수

[in] hCounter

서식을 지정하려는 현재 값의 카운터에 대한 핸들입니다. PdhAddCounter 함수는 이 핸들을 반환합니다.

[in] dwFormat

형식이 지정된 값의 데이터 형식을 결정합니다. 다음 값 중 하나를 지정합니다.

의미
PDH_FMT_DOUBLE
데이터를 배정밀도 부동 소수점 실제로 반환합니다.
PDH_FMT_LARGE
데이터를 64비트 정수로 반환합니다.
PDH_FMT_LONG
데이터를 긴 정수로 반환합니다.
 

비트 포함 OR 연산자(|)를 사용하여 데이터 형식을 다음 크기 조정 요소 중 하나와 결합할 수 있습니다.

의미
PDH_FMT_NOSCALE
카운터의 기본 배율 인수를 적용하지 마세요.
PDH_FMT_NOCAP100
카운터 값이 100보다 크면(예: 다중 프로세서 컴퓨터의 프로세서 부하를 측정하는 카운터 값) 100으로 다시 설정되지 않습니다. 기본 동작은 카운터 값이 100 값으로 제한된다는 것입니다.
PDH_FMT_1000
실제 값을 1,000으로 곱합니다.

[in, out] lpdwBufferSize

ItemBuffer 버퍼의 크기(바이트)입니다. 입력이 0이면 함수는 PDH_MORE_DATA 반환하고 이 매개 변수를 필요한 버퍼 크기로 설정합니다. 버퍼가 필요한 크기보다 큰 경우 함수는 이 매개 변수를 사용된 버퍼의 실제 크기로 설정합니다. 입력에서 지정된 크기가 0보다 크지만 필요한 크기보다 작으면 반환된 크기에 의존하여 버퍼를 다시 할당하면 안 됩니다.

[out] lpdwItemCount

ItemBuffer 버퍼의 카운터 값 수입니다.

[out] ItemBuffer

PDH_FMT_COUNTERVALUE_ITEM 구조의 배열을 수신하는 호출자 할당 버퍼; 구조체에는 카운터 값이 포함됩니다. lpdwBufferSize가 0이면 NULL로 설정합니다.

반환 값

함수가 성공하면 ERROR_SUCCESS 반환합니다.

함수가 실패하면 반환 값은 시스템 오류 코드 또는 PDH 오류 코드입니다. 가능한 값은 다음과 같습니다.

반환 코드 설명
PDH_MORE_DATA
ItemBuffer 버퍼가 개체 이름을 포함할 만큼 크지 않습니다. lpdwBufferSize가 입력에서 0이면 이 반환 값이 필요합니다. 입력에서 지정된 크기가 0보다 크지만 필요한 크기보다 작으면 반환된 크기에 의존하여 버퍼를 다시 할당하면 안 됩니다.
PDH_INVALID_ARGUMENT
매개 변수가 잘못되었거나 형식이 잘못되었습니다. 예를 들어 일부 릴리스에서는 입력에서 지정된 크기가 0보다 크지만 필요한 크기보다 작은 경우 이 오류를 수신할 수 있습니다.
PDH_INVALID_HANDLE
카운터 핸들이 잘못되었습니다.

설명

필요한 버퍼 크기( ItemBufferNULL 로 설정하고 lpdwBufferSize 를 0으로 설정)를 처음으로 두 번 호출하고, 두 번째로 데이터를 가져와야 합니다.

카운터의 데이터는 PdhGetFormattedCounterArray 호출 기간 동안 잠겨 호출을 처리하는 동안 변경되는 것을 방지합니다.

예제

다음 예제에서는 이 함수를 사용하는 방법을 보여줍니다.


#include <windows.h>
#include <stdio.h>
#include <pdh.h>
#include <pdhmsg.h>

#pragma comment(lib, "pdh.lib")

CONST PWSTR COUNTER_PATH = L"\\Processor(*)\\% Processor Time";
CONST ULONG SAMPLE_INTERVAL_MS = 1000;

void main()
{
    PDH_HQUERY hQuery = NULL;
    PDH_STATUS status = ERROR_SUCCESS;
    PDH_HCOUNTER hCounter = NULL;   
    DWORD dwBufferSize = 0;         // Size of the pItems buffer
    DWORD dwItemCount = 0;          // Number of items in the pItems buffer
    PDH_FMT_COUNTERVALUE_ITEM *pItems = NULL;  // Array of PDH_FMT_COUNTERVALUE_ITEM structures

    if (status = PdhOpenQuery(NULL, 0, &hQuery))
    {
        wprintf(L"PdhOpenQuery failed with 0x%x.\n", status);
        goto cleanup;
    }

    // Specify a counter object with a wildcard for the instance.
    if (status = PdhAddCounter(hQuery, COUNTER_PATH, 0, &hCounter))
    {
        wprintf(L"PdhAddCounter failed with 0x%x.\n", status);
        goto cleanup;
    }

    // Some counters need two sample in order to format a value, so
    // make this call to get the first value before entering the loop.
    if (status = PdhCollectQueryData(hQuery))
    {
        wprintf(L"PdhCollectQueryData failed with 0x%x.\n", status);
        goto cleanup;
    }

    for (int i = 0; i < 10; i++)
    {
        Sleep(SAMPLE_INTERVAL_MS);

        if (status = PdhCollectQueryData(hQuery))
        {
            wprintf(L"PdhCollectQueryData failed with 0x%x.\n", status);
            goto cleanup;
        }

        // Get the required size of the pItems buffer.
        status = PdhGetFormattedCounterArray(hCounter, PDH_FMT_DOUBLE, &dwBufferSize, &dwItemCount, pItems);
        if (PDH_MORE_DATA == status)
        {
            pItems = (PDH_FMT_COUNTERVALUE_ITEM *) malloc(dwBufferSize);
            if (pItems)
            {
                status = PdhGetFormattedCounterArray(hCounter, PDH_FMT_DOUBLE, &dwBufferSize, &dwItemCount, pItems);
                if (ERROR_SUCCESS == status)
                {
                    // Loop through the array and print the instance name and counter value.
                    for (DWORD i = 0; i < dwItemCount; i++)
                    {
                        wprintf(L"counter: %s, value %.20g\n", pItems[i].szName, pItems[i].FmtValue.doubleValue);
                    }
                }
                else
                {
                    wprintf(L"Second PdhGetFormattedCounterArray call failed with 0x%x.\n", status);
                    goto cleanup;
                }

                free(pItems);
                pItems = NULL;
                dwBufferSize = dwItemCount = 0;
            }
            else
            {
                wprintf(L"malloc for PdhGetFormattedCounterArray failed.\n");
                goto cleanup;
            }
        }
        else
        {
            wprintf(L"PdhGetFormattedCounterArray failed with 0x%x.\n", status);
            goto cleanup;
        }
    }

cleanup:

    if (pItems)
        free(pItems);

    if (hQuery)
        PdhCloseQuery(hQuery); // Closes all counter handles and the query handle
}

참고

pdh.h 헤더는 PdhGetFormattedCounterArray를 유니코드 전처리기 상수의 정의에 따라 이 함수의 ANSI 또는 유니코드 버전을 자동으로 선택하는 별칭으로 정의합니다. 인코딩 중립 별칭을 인코딩 중립이 아닌 코드와 혼합하면 컴파일 또는 런타임 오류가 발생하는 불일치가 발생할 수 있습니다. 자세한 내용은 함수 프로토타입에 대한 규칙을 참조하세요.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows XP [데스크톱 앱만 해당]
지원되는 최소 서버 Windows Server 2003 [데스크톱 앱만 해당]
대상 플랫폼 Windows
헤더 pdh.h
라이브러리 Pdh.lib
DLL Pdh.dll

추가 정보

PDH_FMT_COUNTERVALUE_ITEM

PdhAddCounter

PdhGetFormattedCounterValue

PdhGetRawCounterArray

PdhGetRawCounterValue