PdhGetCounterInfo 會傳回 null 值的版本 2 的效能計數器解說文字

適用於: Windows 10Windows 8.1Windows 7 更多

徵狀


版本 2 的效能計數器帶來 Windows Vista 中,因為需效能計數器架構已變更為簡化程序的提供計數器資料給消費者。應用程式會使用版本 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 產品確實有上述問題。