какими апи (если таковые вообще есть) можно получить сабж? как это делает к примеру taskmgr или procexp (если не брать в расчёт NtGetSystemInformation)?
А это решается простым алгоритмом подсчета. Никакие великие API не помогут в этом. Меньше верь тому, что там написано. Native API не имеет тенденции жутко меняться от релиза к релизу, и уж тем более быть абсолютно несовместимым.
На сях (использовал в каком-то своем проекте): Код (Text): HQUERY hQuery; HQUERY hCounter; PDH_STATUS pdhStatus = 0; PDH_STATUS pdh_Init(HQUERY &hQuery, HCOUNTER &hCounter) // инициализируем PDH { PDH_STATUS pdhResult = 0; TCHAR szCounterPath[1024]; DWORD dwPathSize = 1024; PDH_COUNTER_PATH_ELEMENTS pe; DWORD dwType = 0; pdhResult = PdhOpenQuery( NULL, 0, &hQuery ); // запрос на открытие PDH if ( pdhResult != ERROR_SUCCESS ) // если была ошибка, то return pdhResult; // выходим, возвращая номер ошибки pe.szMachineName = 0l; pe.szObjectName = L"Processor"; pe.szInstanceName = L"_Total"; pe.szParentInstance = NULL; pe.dwInstanceIndex = 0; pe.szCounterName = L"% Processor Time"; // создаем путь к счетчику PDH pdhResult = PdhMakeCounterPath(&pe, szCounterPath, &dwPathSize, 0); if (pdhResult != ERROR_SUCCESS) // если была ошибка, то return pdhResult; // выходим, возвращая номер ошибки // открываем счетчик PDH //wcscpy(szCounterPath, L"\\Processor(_Total)\\% Processor Time"); pdhResult = PdhAddCounter(hQuery, L"\\Процессор(0)\\% загруженности процессора", 0, &hCounter); if (pdhResult != ERROR_SUCCESS) // если была ошибка, то return pdhResult; // выходим, возвращая номер ошибки // если дошли до этого места, то ошибки на 100% не было! return pdhResult; } int GetCPUUsage(HQUERY hQuery, HCOUNTER hCounter, PDH_STATUS &pdhStatus) // получаем загруженность проца { DWORD dwType = 0; // даем запрос на сборы инфы pdhStatus = PdhCollectQueryData(hQuery); if (pdhStatus != ERROR_SUCCESS) // если была ошибка, то return PDH_ERROR; // выходим, возвращая ошибку _PDH_FMT_COUNTERVALUE pfci; ZeroMemory(&pfci, sizeof(pfci)); // очищаем структуру pfci // Получаем инфу о загруженности проца! pdhStatus = PdhGetFormattedCounterValue( hCounter, PDH_FMT_DOUBLE, &dwType, &pfci); if (pdhStatus != ERROR_SUCCESS) // если была ошибка, то return PDH_ERROR; // выходим, возвращая ошибку return (int)pfci.doubleValue; // возвращаем загруженность проца! } void pdh_Uninit(HQUERY hQuery, HCOUNTER hCounter) // анинициализация { PdhRemoveCounter(hCounter); // удаляем счетчик PdhCloseQuery(hQuery); // закрываем запрос }
DoZENT Токмо с этим самым Performance Data Helper имеет место быть некий глюк: http://support.microsoft.com/kb/315700