看到好多朋友询问怎样得到系统信息(象任务管理器一样),前段时间研究了一番,有所领悟,现与大家共享。
下面是部分测试代码:
#include <windows.h> #include <stdio.h> #include <conio.h> #include <tchar.h> #include <pdh.h>
#define MAXPATH 80
int __cdecl _tmain (int argc, TCHAR **argv) {
HQUERY hQuery; HCOUNTER *pCounterHandle; PDH_STATUS pdhStatus; PDH_FMT_COUNTERVALUE fmtValue; DWORD ctrType; CHAR szPathBuffer[MAXPATH] = {'\0'}; int nRetCode = 0;
// Open the query object. pdhStatus = PdhOpenQuery (0, 0, &hQuery);
pCounterHandle = (HCOUNTER *)GlobalAlloc(GPTR, sizeof(HCOUNTER));
/* \\Processor(_Total)\\% Processor Time CPU使用率 \\System\\Processes 当前系统进程数 \\System\\Threads 当前系统线程数 \\Memory\\Commit Limit 总共内存数K (包括虚拟内存) \\Memory\\Committed Bytes 已用内存数K (包括虚拟内存) \\TCP\\Connections Active 系统中已建立的 TCP连接个数 其它Object Items 可以利用PdhEnumObjects()和PdhEnumObjectItems()得到 反正我只要用到上面的东东:) */ strcat(szPathBuffer,"\\System\\Processes");
pdhStatus = PdhAddCounter (hQuery, szPathBuffer, 0, pCounterHandle); // "Prime" counters that need two values to display a // formatted value. pdhStatus = PdhCollectQueryData (hQuery);
// Get the current value of this counter. pdhStatus = PdhGetFormattedCounterValue (*pCounterHandle, PDH_FMT_DOUBLE, &ctrType, &fmtValue);
//fmtValue.doubleValue为所要的结果 if (pdhStatus == ERROR_SUCCESS) { printf (TEXT(",\"%.20g\"\n"), fmtValue.doubleValue); } else { // Print the error value. printf (TEXT("error.\"-1\"")); }
// Close the query. pdhStatus = PdhCloseQuery (hQuery);
return nRetCode; }

|