winreg.h で公開されている API を介して Perfmon カウンター値を収集するアプリがあります。Perfmon カウンター値を収集するRegQueryValueExW
には、関心のある Perfmon カウンターの ID を渡す呼び出しを行う必要があります。その ID Perfmon カウンター名のリストをレジストリに照会し、関心のあるものを探す必要があります。
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" という名前の 2 つ目の perfmon カウンターが存在するため、上記で間違ったカウンターの ID が検出されることです。
順序以外に 2 つを区別する方法がわかりません。現時点では、一致する名前で最初に見つけたカウンターを取得するのが最善の策だと思います。より良いオプションはありますか?
(これを .Net などに移行することはできません)