У меня есть приложение, которое собирает значения счетчиков Perfmon через API, представленный в winreg.h - чтобы собрать значения счетчиков Perfmon, я должен позвонить RegQueryValueExW
, передав идентификатор интересующего меня счетчика Perfmon. и для того, чтобы получить этот идентификатор, мне нужно запросить в реестре список имен счетчиков Perfmon и пройти поиск нужного мне
C ++ не является моим языком выбора, поэтому ниже приведен шаткий пример, возможно, с множеством синтаксических ошибок, но вы поняли:
DWORD IdProcessIndex = 0;
WCHAR* RawStrings = new WCHAR[ len ];
WCHAR* pCurrent;
DWORD nLenInChars;
// Get the name id of the "ID Process" counter
RegQueryValueExW(HKEY_PERFORMANCE_DATA, COUNTER009, 0, 0, (PBYTE)RawStrings, &len)
pCurrent = (WCHAR*)RawStrings;
while ( (nLenInChars = wcslen(pCurrent)) != 0 && IdProcessIndex == 0 )
{
WCHAR* pName;
pName = pCurrent + nLenInChars + 1;
if ( wcscmp( pName, L"ID Process" ) == 0)
{
IdProcessIndex = _wtoi( pCurrent );
}
pCurrent = pName + wcslen( pName ) + 1;
}
// Get data for the "ID Process" counter
WCHAR strIdProcessIndex[32];
_itow( nIdProcessIndex, strIdProcessIndex, 10 );
RegQueryValueExW(HKEY_PERFORMANCE_DATA, strIdProcessIndex, NULL, NULL, (PBYTE)pData, &len)
Проблема в том, что на некоторых машинах (на которых установлен комплект разработчика Windows CE) есть второй счетчик perfmon с именем «Идентификатор процесса», и поэтому приведенный выше код находит идентификатор неверного счетчика.
Я не вижу никакого способа отличить эти два типа, кроме того, в каком порядке они находятся - в настоящий момент я считаю, что лучше всего взять первый найденный счетчик с подходящим именем, есть ли лучший вариант?
(Невозможно перенести это в .Net или что-то подобное)