关于 c:Vista 上的性能计数器问题

Problem with performance counters on Vista

我在使用性能监控 API 的 Vista 上遇到了一个奇怪的问题。我目前正在使用基于 PdhGetFormattedCounterValue() 在 XP/2k 上运行良好的代码。我开始使用 PdhExpandWildCardPath 来扩展计数器(我对整体网络统计感兴趣),我正在查看的计数器是:

1
2
3
4
5
\\\
etwork Interface(*)\\\\Bytes Received/sec
\\\
etwork Interface(*)\\\\Bytes Sent/sec
\\\\Processor(_Total)\\\\% Processor Time

问题是他们在第一次调用时返回 PDH_INVALID_DATA,我认为这不是问题,因为如果我再次查询它,我将开始获取数据而不会出现错误。问题是这样的——虽然处理器时间完全按照预期工作,但网络接口计数器都没有返回任何东西——一直都是 0。我使用 Perfmon 验证他们正在正常报告数据,所以我不知道可能是什么问题。我在 MS 发现了这个:

http://support.microsoft.com/?scid=kb;en-us;287159


事实证明,问题在于网络接口都是通配符,而处理器一实际上已经被性能监控卷起来了。我没有意识到 PdhExpandWildCardPath 没有返回 PdhAddCounter 可以直接使用的东西。我的意思是,如果 ExpandWildCard 返回 3 个扩展匹配项,它们会以空分隔字符串的形式返回 - 我理解这一点,但我假设 AddCounter 将有效地创建一个包含所有三个匹配项的计数器。不,现实是我需要分解每条路径并从 AddCounter 单独请求它,然后在获得结果时手动汇总结果。

希望这可以帮助其他人避免我犯的同样的错误,减少挫败感。 ;)