通过winreg查找perfmon计数器id

时间:2009-07-13 12:43:35

标签: c++ perfmon winreg

我有一个应用程序通过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或类似的东西)

2 个答案:

答案 0 :(得分:2)

我意识到这是旧的,但万一有用:

  1. Tim是对的,自己解析二进制数据很困难。为痛苦的世界做好准备。我建议PDH(为你封装注册表访问),或者如果失败,WMI(虽然注意WMI要慢得多)。
  2. 您无法获取仅具有索引ID Process的效果计数器784的数据。您需要为整个对象(Process获取它,索引为230)。
  3. 所有Windows安装中内置对象的ID均为guaranteed to be the same。因此,如果这是您需要的唯一计数器,请使用230。 :)

答案 1 :(得分:0)

  

我无法找到区分两者的方法

他们是否给出相同的价值?如果是这样,你为什么要关心你使用哪一个?

如果它们不同,你能同时试试吗? (例如,两个ID上的OpenProcess)

  

(无法将其迁移到.Net或类似的东西)

如何使用PDH API(例如,PdhOpenQuery)或WMI公开的COM接口?你可以用原生C ++做到这两点。

我从来没有通过直接读取注册表来使用性能计数器,但可能有两个“ID Process”计数器出于某种原因(就像WoW16 / 64下的应用程序有单独的进程ID?),以及替代方案将显示相同的事情。您是否在AdminstrativeTools \ Performance MMC面板中看到其中两个?