2

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

4

2 回答 2

3

我意识到这是旧的,但如果它有帮助:

  1. 蒂姆是对的,自己解析二进制数据很困难。为痛苦的世界做好准备。我推荐 PDH(为您封装注册表访问),或者如果失败,则推荐 WMI(尽管请注意 WMI 慢得多)。
  2. 您不能仅获取性能计数器(ID Process带索引784)的数据。您需要为整个对象(Process带有索引230)获取它。
  3. The IDs for built in objects are guaranteed to be the same on all Windows installations. So if this is the only counter you need, just use 230. :)
于 2010-03-22T23:14:22.823 回答
0

我看不出有什么方法可以区分这两者

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

如果它们不同,您可以尝试两者吗?(例如,两个 ID 上的 OpenProcess)

(不可能将其迁移到 .Net 或类似的东西)

使用 PDH API(例如 PdhOpenQuery)或 WMI 公开的 COM 接口怎么样?您可以从本机 C++ 执行这两项操作。

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

于 2009-07-14T00:04:34.117 回答