我有一个应用程序,它通过 winreg.h 中公开的 API 收集 Perfmon 计数器值 - 为了收集 Perfmon 计数器值,我必须调用RegQueryValueExW
传递我感兴趣的 Perfmon 计数器的 id,以便获得我需要在注册表中查询 Perfmon 计数器名称列表并查找我感兴趣的那个 ID
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 或类似的东西)