2009-07-13 41 views
2

我有一個應用程序通過winreg.h中公開的API收集Perfmon計數器值 - 爲了收集Perfmon計數器值,我必須撥打RegQueryValueExW傳遞給Perfmon計數器的id我對此感興趣,爲了獲得該ID,我需要查詢註冊表以查找Perfmon計數器名稱列表並查找我感興趣的ID通過winreg查找perfmon counter 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) 

問題是,在某些mac hines(安裝了Windows CE開發工具包的),第二個perfmon計數器的名稱爲「ID Process」,因此上面找到了錯誤計數器的ID。

我看不出有什麼辦法來區分他們所處的順序 - 目前我認爲我最好的選擇是採用第一個匹配名稱的計數器,是否有更好的選擇?

(它無法將此遷移到.NET或類似的東西)

回答

2

我知道這是舊的,但在情況下,它可以幫助:

  1. 蒂姆是正確的,解析二進制數據自己是困難的。準備好迎接一個痛苦的世界。我建議PDH(爲你封裝註冊表訪問),或者如果失敗的話,WMI(儘管注意WMI要慢得多)。 (ID Process,索引號784)。您需要獲取整個對象(Process,索引號爲230)。
  2. 所有Windows安裝中內置對象的標識爲guaranteed to be the same。因此,如果這是您需要的唯一計數器,請使用230。 :)
+0

Thankyou - 我還沒有意識到ID是gauguteed修復。這使事情變得更簡單! – Justin 2010-03-23 09:58:11

0

我看不到任何方式兩個

區分他們是否給予同樣的價值?如果是這樣,爲什麼你會關心你使用哪一個?

如果他們不同,你可以嘗試嗎? (兩個標識例如,OpenProcess)

(它無法將此遷移到.NET或類似的東西)

如何使用PDH API(例如,PdhOpenQuery),或COM WMI公開的接口?你可以用本地C++來完成這兩個任務。

我從來沒有通過直接讀取註冊表來使用性能計數器,但可能出於某種原因有兩個「ID Process」計數器(就像WoW16/64下的應用程序有不同的進程ID?),以及一個替代方案將顯示相同的事情。您是否在AdminstrativeTools \ Performance MMC面板中看到其中兩個?