The following example calls the PdhEnumObjectItems function to enumerate the instances and counters of the process objects on the local computer.
// This program needs only the essential Windows header files. #define WIN32_LEAN_AND_MEAN 1 #include <windows.h> #include <malloc.h> #include <stdio.h> #include <pdh.h> #include <pdhmsg.h> #pragma comment(lib, "pdh.lib") CONST PWSTR COUNTER_OBJECT = L"Process"; void main(void) { PDH_STATUS status = ERROR_SUCCESS; LPWSTR pwsCounterListBuffer = NULL; DWORD dwCounterListSize = 0; LPWSTR pwsInstanceListBuffer = NULL; DWORD dwInstanceListSize = 0; LPWSTR pTemp = NULL; // Determine the required buffer size for the data. status = PdhEnumObjectItems( NULL, // real-time source NULL, // local machine COUNTER_OBJECT, // object to enumerate pwsCounterListBuffer, // pass NULL and 0 &dwCounterListSize, // to get required buffer size pwsInstanceListBuffer, &dwInstanceListSize, PERF_DETAIL_WIZARD, // counter detail level 0); if (status == PDH_MORE_DATA) { // Allocate the buffers and try the call again. pwsCounterListBuffer = (LPWSTR)malloc(dwCounterListSize * sizeof(WCHAR)); pwsInstanceListBuffer = (LPWSTR)malloc(dwInstanceListSize * sizeof(WCHAR)); if (NULL != pwsCounterListBuffer && NULL != pwsInstanceListBuffer) { status = PdhEnumObjectItems( NULL, // real-time source NULL, // local machine COUNTER_OBJECT, // object to enumerate pwsCounterListBuffer, &dwCounterListSize, pwsInstanceListBuffer, &dwInstanceListSize, PERF_DETAIL_WIZARD, // counter detail level 0); if (status == ERROR_SUCCESS) { wprintf(L"Counters that the Process objects defines:\n\n"); // Walk the counters list. The list can contain one // or more null-terminated strings. The list is terminated // using two null-terminator characters. for (pTemp = pwsCounterListBuffer; *pTemp != 0; pTemp += wcslen(pTemp) + 1) { wprintf(L"%s\n", pTemp); } wprintf(L"\nInstances of the Process object:\n\n"); // Walk the instance list. The list can contain one // or more null-terminated strings. The list is terminated // using two null-terminator characters. for (pTemp = pwsInstanceListBuffer; *pTemp != 0; pTemp += wcslen(pTemp) + 1) { wprintf(L"%s\n", pTemp); } } else { wprintf(L"Second PdhEnumObjectItems failed with %0x%x.\n", status); } } else { wprintf(L"Unable to allocate buffers.\n"); status = ERROR_OUTOFMEMORY; } } else { wprintf(L"\nPdhEnumObjectItems failed with 0x%x.\n", status); } if (pwsCounterListBuffer != NULL) free (pwsCounterListBuffer); if (pwsInstanceListBuffer != NULL) free (pwsInstanceListBuffer); }
Send comments about this topic to Microsoft
Build date: 2/3/2012
why Function "PdhEnumObjectItem" return "0xC0000BB8 (PDH_CSTATUS_NO_OBJECT)" when I used in VISTA OS?
ps: param: "LPCTSTR szObjectName" is using "Thread" ; but when I used "process" is ok.
If I have multiple instances of an application running on the machine, how can I distinguish between them? I need to monitor performance for the current process, but several instances of it may be running. The instance list contains only names, e.g. 7 times 'svchost'. Can I query some additional information, e.g. process identifier?
[Noelle Mallory - MSFT] Please post questions to the MSDN Forums at http://forums.microsoft.com/msdn. You will likely get a quicker response through the forum than through the Community Content.