Mit PDH Leistungsindikatorwert abrufen

Zusammenfassung

Performance Manager (PDH) APIs können verwendet werden, zum Sammeln von Leistungsdaten verschiedener Leistungsindikatoren oder Instanzen, die auf dem System verfügbar sind. Dieser Artikel beschreibt die PDH-API-Aufrufe, die erforderlich sind, um Leistungsdaten für ein Leistungsobjekt, Leistungsindikator und Instanznamen.

Weitere Informationen

Beispielcode hat eine PDH_COUNTER_PATH_ELEMENTS CPE-Tabelle, die angibt, Leistungsobjekt, Leistungsindikator und Namen für die Anwendung die Daten sammeln.

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

BOOL WINAPI GetCounterValues(LPTSTR serverName);

void main(int argc, char *argv[])
{
if (argc > 1)
{
// argv[1] - Server Name

GetCounterValues(argv[1]);
}
else
{
// Local System

GetCounterValues(NULL);
}
}

BOOL WINAPI GetCounterValues(LPTSTR serverName)
{
PDH_STATUS s;

HQUERY hQuery;

// Array to specify the performance object, counter and instance for
// which performance data should be collected.

// typedef struct _PDH_COUNTER_PATH_ELEMENTS {
// LPTSTR szMachineName;
// LPTSTR szObjectName;
// LPTSTR szInstanceName;
// LPTSTR szParentInstance;
// DWORD dwInstanceIndex;
// LPTSTR szCounterName;
// } PDH_COUNTER_PATH_ELEMENTS, *PPDH_COUNTER_PATH_ELEMENTS;

// Each element in the array is a PDH_COUNTER_PATH_ELEMENTS structure.
PDH_COUNTER_PATH_ELEMENTS cpe[] =
{
{ NULL, "Memory", NULL, NULL, -1, "Cache Bytes" },
{ NULL, "Memory", NULL, NULL, -1, "Available Bytes" },
{ NULL, "Processor", "_Total", NULL, -1, "% Processor Time" }
};

HCOUNTER hCounter[sizeof(cpe)/sizeof(cpe[0])];

char szFullPath[MAX_PATH];
DWORD cbPathSize;
int i, j;

BOOL ret = FALSE;

PDH_FMT_COUNTERVALUE counterValue;

// Only do this setup once.
if ((s = PdhOpenQuery(NULL, 0, &hQuery)) != ERROR_SUCCESS)
{
fprintf(stderr, "POQ failed %08x\n", s);
return ret;
}

for (i = 0; i < sizeof(hCounter)/sizeof(hCounter[0]); i++)
{
cbPathSize = sizeof(szFullPath);

cpe[i].szMachineName = serverName;

if ((s = PdhMakeCounterPath(&cpe[i],
szFullPath, &cbPathSize, 0)) != ERROR_SUCCESS)
{
fprintf(stderr,"MCP failed %08x\n", s);
return ret;
}

if (cpe[i].szInstanceName)
{
printf("Adding [%s\\%s\\%s]\n",
cpe[i].szObjectName,
cpe[i].szCounterName,
cpe[i].szInstanceName);
}
else
printf("Adding [%s\\%s]\n",
cpe[i].szObjectName,
cpe[i].szCounterName);

if ((s = PdhAddCounter(hQuery, szFullPath, 0, &hCounter[i]))
!= ERROR_SUCCESS)
{
fprintf(stderr, "PAC failed %08x\n", s);
return ret;
}
}

for (i = 0; i < 20; i++)
{
Sleep(100);

// Collect data as often as you need to.
if ((s = PdhCollectQueryData(hQuery)) != ERROR_SUCCESS)
{
fprintf(stderr, "PCQD failed %08x\n", s);
return ret;
}

if (i == 0) continue;

// Extract the calculated performance counter value for each counter or
// instance.
for (j = 0; j < sizeof(hCounter)/sizeof(hCounter[0]); j++)
{
if ((s = PdhGetFormattedCounterValue(hCounter[j], PDH_FMT_DOUBLE,
NULL, &counterValue)) != ERROR_SUCCESS)
{
fprintf(stderr, "PGFCV failed %08x\n", s);
continue;
}
if (cpe[j].szInstanceName)
{
printf("%s\\%s\\%s\t\t : [%3.3f]\n",
cpe[j].szObjectName,
cpe[j].szCounterName,
cpe[j].szInstanceName,
counterValue.doubleValue);
}
else
printf("%s\\%s\t\t : [%3.3f]\n",
cpe[j].szObjectName,
cpe[j].szCounterName,
counterValue.doubleValue);
}
}

// Remove all the counters from the query.
for (i = 0; i < sizeof(hCounter)/sizeof(hCounter[0]); i++)
{
PdhRemoveCounter(hCounter[i]);
}

// Only do this cleanup once.
PdhCloseQuery(hQuery);

return TRUE;
}

Referenzen

PDH APIs werden in der Datei Pdh.dll implementiert, die mit dem Betriebssystem Microsoft Windows 2000 und Microsoft Windows XP. Für das Betriebssystem Microsoft Windows NT 4.0 können Sie einen separaten verteilbaren Pdh.dll herunterladen.


Weitere Informationen zu weitervertreibbaren Version des Pdh.dll für Windows NT 4.0 finden Sie der Microsoft Knowledge Base:

284996 Datei: neueste verteilbare PDH.dll für Windows NT 4.0
Weitere Informationen zu den PDH APIs finden Sie unter "Performance Monitoring" in der MSDN Library im Abschnitt "Base Services".
Eigenschaften

Artikelnummer: 287158 – Letzte Überarbeitung: 23.01.2017 – Revision: 1

Feedback