PdhGetCounterInfo 返回 NULL 版本 2 的性能计数器说明文字

适用于: Windows 10Windows 8.1Windows 7 详细

症状


在 Windows Vista 中引入了版本 2 的性能计数器,因为性能计数器架构已更改,以简化为使用者提供计数器数据的过程。应用程序将使用版本 1 或版本 2 性能计数器提供程序。
请考虑PdhGetCounterInfo API 用于检索有关版本 2 的性能计数器的信息的方案。第一次调用PdhAddCounter添加版本 2 性能计数器。然后,调用PdhGetCounterInfo函数来获取信息。在这种情况下,由PdhGetCounterInfo PDH_COUNTER_INFO结构中的szExplainText字段将设置为 NULL。此问题不适用于第 1 版的性能计数器。

原因


发生此问题是因为PdhAddCounterPdhGetCounterInfo函数不能正确处理版本 2 的性能计数器的说明文字。

解决方案


Windows 10 1703年版本中已解决了此问题。

替代方法


若要变通解决此问题,请检索直接通过注册表函数的版本 2 的性能计数器的说明文字。
 
例如: 您可以按照下列步骤操作:
 
  1. HKEY_PERFORMANCE_NLSTEXT注册表项检索计数器名称的文本字符串:
    RegQueryValueEx(HKEY_PERFORMANCE_NLSTEXT, L"Counter", NULL, NULL, (LPBYTE)pBufferCounter, &dwBufferSize);
  2. HKEY_PERFORMANCE_NLSTEXT注册表项检索文本字符串的说明文字:
    RegQueryValueEx(HKEY_PERFORMANCE_NLSTEXT, L"Help", NULL, NULL, (LPBYTE)pBufferHelp, &dwBufferSize);
  3. 检索由以下注册表的最后一个索引:
    RegOpenKeyEx( HKEY_LOCAL_MACHINE,L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Perflib", 0,KEY_READ, &hkey );RegQueryValueEx(hkey, L"Last Help", NULL, 0, (LPBYTE)&dwEntries,&dwSize);
  4. 使用pBufferCounterpBufferHelp来定位所需的说明文字。找到后从pBufferCounter,以便确定索引相关联的索引值的增加所需的计数器名称索引号解释了pBufferHelp中的文本。如果您需要将相关联的计数器名称和说明文字与计数器对象,您可以从HKEY_PERFORMANCE_DATA注册表项检索对象的信息:
    RegQueryValueEx(HKEY_PERFORMANCE_DATA, L"Global", NULL, NULL, pBuffer, &dwSize);
    标识版本 2 性能计数器提供程序在"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Perflib\_V2Providers"在注册表中列出的 Guid。作为名为NeutralName的每个 GUID 的值,您可以找到计数器对象名称。

有关注册表函数的详细信息,请转到使用注册表函数使用计数器数据为.

状态


Microsoft 已确认这是在“适用范围”部分中列出的 Microsoft 产品存在的问题。