Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Retorna uma matriz de valores de contador formatados. Use essa função quando quiser formatar os valores de contador de um contador que contém um caractere curinga para o nome da instância.
Sintaxe
PDH_FUNCTION PdhGetFormattedCounterArrayA(
[in] PDH_HCOUNTER hCounter,
[in] DWORD dwFormat,
[in, out] LPDWORD lpdwBufferSize,
[out] LPDWORD lpdwItemCount,
[out] PPDH_FMT_COUNTERVALUE_ITEM_A ItemBuffer
);
Parâmetros
[in] hCounter
Manipule para o contador cujo valor atual você deseja formatar. A função PdhAddCounter
[in] dwFormat
Determina o tipo de dados do valor formatado. Especifique um dos valores a seguir.
Você pode usar o operador OR inclusivo bit a bit (|) para combinar o tipo de dados com um dos seguintes fatores de dimensionamento.
[in, out] lpdwBufferSize
Tamanho do buffer
[out] lpdwItemCount
Número de valores de contador no buffer
[out] ItemBuffer
Buffer alocado pelo chamador que recebe uma matriz de estruturas de PDH_FMT_COUNTERVALUE_ITEM; as estruturas contêm os valores do contador. Defina como NULL se lpdwBufferSize for zero.
Valor de retorno
Se a função for bem-sucedida, ela retornará ERROR_SUCCESS.
Se a função falhar, o valor retornado será um código de erro do sistema ou um código de erro PDH . Veja a seguir os valores possíveis.
| Código de retorno | Descrição |
|---|---|
|
O itembuffer buffer não é grande o suficiente para conter o nome do objeto. Esse valor retornado será esperado se lpdwBufferSize for zero na entrada. Se o tamanho especificado na entrada for maior que zero, mas menor que o tamanho necessário, você não deverá contar com o tamanho retornado para realocar o buffer. |
|
Um parâmetro não é válido ou está formatado incorretamente. Por exemplo, em algumas versões, você poderá receber esse erro se o tamanho especificado na entrada for maior que zero, mas menor que o tamanho necessário. |
|
O identificador do contador não é válido. |
Observações
Você deve chamar essa função duas vezes, a primeira vez para obter o tamanho do buffer necessário (definir itembuffer para NULL e lpdwBufferSize como 0) e a segunda vez para obter os dados.
Os dados do contador são bloqueados durante a chamada para PdhGetFormattedCounterArray para evitar alterações durante o processamento da chamada.
Exemplos
O exemplo a seguir mostra como usar essa função.
#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
}
Nota
O cabeçalho pdh.h define PdhGetFormattedCounterArray como um alias que seleciona automaticamente a versão ANSI ou Unicode dessa função com base na definição da constante do pré-processador UNICODE. A combinação do uso do alias neutro de codificação com código que não é neutro em codificação pode levar a incompatibilidades que resultam em erros de compilação ou de runtime. Para obter mais informações, consulte Conventions for Function Prototypes.
Requisitos
| Requisito | Valor |
|---|---|
| de cliente com suporte mínimo | Windows XP [somente aplicativos da área de trabalho] |
| servidor com suporte mínimo | Windows Server 2003 [somente aplicativos da área de trabalho] |
| da Plataforma de Destino |
Windows |
| cabeçalho | pdh.h |
| biblioteca | Pdh.lib |
| de DLL |
Pdh.dll |