PdhGetFormattedCounterArrayA-Funktion (pdh.h)
Gibt ein Array von formatierten Zählerwerten zurück. Verwenden Sie diese Funktion, wenn Sie die Indikatorenwerte eines Zählers formatieren möchten, der ein Feldhalterzeichen für den instance Namen enthält.
Syntax
PDH_FUNCTION PdhGetFormattedCounterArrayA(
[in] PDH_HCOUNTER hCounter,
[in] DWORD dwFormat,
[in, out] LPDWORD lpdwBufferSize,
[out] LPDWORD lpdwItemCount,
[out] PPDH_FMT_COUNTERVALUE_ITEM_A ItemBuffer
);
Parameter
[in] hCounter
Behandeln Sie den Zähler, dessen aktueller Wert Sie formatieren möchten. Die PdhAddCounter-Funktion gibt dieses Handle zurück.
[in] dwFormat
Bestimmt den Datentyp des formatierten Werts. Geben Sie einen der folgenden Werte an.
Sie können den bitweisen inklusiven OR-Operator (|) verwenden, um den Datentyp mit einem der folgenden Skalierungsfaktoren zu kombinieren.
[in, out] lpdwBufferSize
Größe des ItemBuffer-Puffers in Bytes. Wenn bei der Eingabe null angegeben wird, gibt die Funktion PDH_MORE_DATA zurück und legt diesen Parameter auf die erforderliche Puffergröße fest. Wenn der Puffer größer als die erforderliche Größe ist, legt die Funktion diesen Parameter auf die tatsächliche Größe des verwendeten Puffers fest. Wenn die angegebene Größe für die Eingabe größer als 0, aber kleiner als die erforderliche Größe ist, sollten Sie sich nicht auf die zurückgegebene Größe verlassen, um den Puffer neu zuzurücken.
[out] lpdwItemCount
Anzahl der Zählerwerte im ItemBuffer-Puffer .
[out] ItemBuffer
Vom Aufrufer zugewiesener Puffer, der ein Array von PDH_FMT_COUNTERVALUE_ITEM Strukturen empfängt; die Strukturen enthalten die Zählerwerte. Legen Sie auf NULL fest, wenn lpdwBufferSize null ist.
Rückgabewert
Wenn die Funktion erfolgreich ist, gibt sie ERROR_SUCCESS zurück.
Wenn die Funktion fehlschlägt, ist der Rückgabewert ein Systemfehlercode oder ein PDH-Fehlercode. Im Folgenden sind mögliche Werte aufgeführt.
Rückgabecode | Beschreibung |
---|---|
|
Der ItemBuffer-Puffer ist nicht groß genug, um den Objektnamen zu enthalten. Dieser Rückgabewert wird erwartet, wenn lpdwBufferSize bei der Eingabe null ist. Wenn die angegebene Größe für die Eingabe größer als 0, aber kleiner als die erforderliche Größe ist, sollten Sie sich nicht auf die zurückgegebene Größe verlassen, um den Puffer neu zuzurücken. |
|
Ein Parameter ist ungültig oder falsch formatiert. Bei einigen Releases kann dieser Fehler beispielsweise angezeigt werden, wenn die angegebene Größe für die Eingabe größer als 0, aber kleiner als die erforderliche Größe ist. |
|
Das Zählerhandle ist ungültig. |
Hinweise
Sie sollten diese Funktion zweimal aufrufen, zum ersten Mal zum Abrufen der erforderlichen Puffergröße (Festlegen von ItemBuffer auf NULL und lpdwBufferSize auf 0) und beim zweiten Mal zum Abrufen der Daten.
Die Daten für den Zähler sind für die Dauer des Aufrufs von PdhGetFormattedCounterArray gesperrt, um Änderungen während der Verarbeitung des Aufrufs zu verhindern.
Beispiele
Das folgende Beispiel zeigt die Verwendung dieser Funktion.
#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
}
Hinweis
Der pdh.h-Header definiert PdhGetFormattedCounterArray als Alias, der automatisch die ANSI- oder Unicode-Version dieser Funktion basierend auf der Definition der UNICODE-Präprozessorkonstante auswählt. Das Mischen der Verwendung des codierungsneutralen Alias mit nicht codierungsneutralem Code kann zu Nichtübereinstimmungen führen, die zu Kompilierungs- oder Laufzeitfehlern führen. Weitere Informationen finden Sie unter Konventionen für Funktionsprototypen.
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) | Windows XP [nur Desktop-Apps] |
Unterstützte Mindestversion (Server) | Windows Server 2003 [nur Desktop-Apps] |
Zielplattform | Windows |
Kopfzeile | pdh.h |
Bibliothek | Pdh.lib |
DLL | Pdh.dll |