我有一个通过 winreg.h 中公开的 API 收集 Perfmon 计数器值的应用程序 - 为了收集 Perfmon 计数器值,我必须调用RegQueryValueExW
传递我感兴趣的 Perfmon 计数器的 id,为了获取该 ID,我需要查询注册表以获取 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 开发工具包的机器)上有第二个名为“ID Process”的 perfmon 计数器,因此上面的代码找到了错误计数器的 ID。
除了它们所处的顺序之外,我看不到任何方法来区分两者 - 目前我认为我最好的选择是采用我找到的具有匹配名称的第一个计数器,是否有更好的选择?
(不可能将其迁移到 .Net 或类似的东西)