2009-07-13 9 views
2

J'ai une application qui recueille les valeurs du compteur Perfmon à travers l'API exposée dans winreg.h - afin de collecter des valeurs de compteur Perfmon Je dois faire un appel à RegQueryValueExW passant dans l'ID du compteur Perfmon I Je suis intéressé, et afin d'obtenir cet ID, je dois interroger le registre pour la liste des noms de compteurs Perfmon et passer par la recherche de celui qui m'intéresseTrouver l'identifiant du compteur perfmon via winreg

C++ n'est pas ma langue de choix, donc ce qui suit est un exemple fragile, probablement avec beaucoup d'erreurs de syntaxe, mais vous obtenez l'idée:

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) 

Problème est que sur certains mac hines (ceux avec le kit de développement Windows CE installé) il y a un deuxième compteur de perfmon avec le nom "ID Process", et donc ce qui précède trouve l'ID du mauvais compteur.

Je ne vois pas de moyen de différencier les deux autres que l'ordre dans lequel ils sont - en ce moment je pense que mon meilleur pari est de prendre le premier compteur que je trouve avec un nom correspondant, y at-il une meilleure option ?

(Ce ne est pas possible de migrer cela .Net ou quelque chose comme ça)

Répondre

2

Je me rends compte que cela est vieux, mais dans le cas où il aide:

  1. Tim est juste, analyse les données binaires vous est difficile. Préparez-vous pour un monde de douleur. Je recommanderais PDH (encapsule les accès de registre pour vous), ou si cela échoue, WMI (cependant notez que WMI est beaucoup plus lent).
  2. Vous ne pouvez pas obtenir de données uniquement pour un compteur de performance (ID Process, avec l'index 784). Vous devez l'obtenir pour l'objet entier (Process, avec l'index 230). Les ID des objets intégrés sont guaranteed to be the same sur toutes les installations Windows. Donc, si c'est le seul compteur dont vous avez besoin, utilisez simplement 230. :)
+0

Merci - Je n'avais pas réalisé que les identifiants étaient garantis pour être corrigés. Cela rend les choses beaucoup plus simples! – Justin

+1

Heureux que c'était utile. Notez que cela n'est vrai que pour les compteurs intégrés et non pour les compteurs installés après Windows, tels que les compteurs SQL Server. –

0

Je ne peux pas voir un moyen de différencier entre les deux

Sont-ils donnent la même valeur? Si oui, pourquoi voudriez-vous celle que vous utilisez?

S'ils sont différents, pouvez-vous essayer les deux? (Par exemple, OpenProcess sur les ID)

(Ce ne est pas possible de migrer cela .Net ou quelque chose comme ça)

Comment l'utilisation de l'API PDH (par exemple, PdhOpenQuery), ou COM interfaces exposées par WMI? Vous pouvez faire les deux à partir de C++ natif. Je n'ai jamais utilisé les compteurs de performance en lisant le registre directement, mais il se peut qu'il y ait deux compteurs "Processus d'ID" pour une bonne raison (comme les applications sous WoW16/64 ont des ID de processus séparés?), Et une alternative montrera la même chose. En voyez-vous deux dans le panneau AdminstrativeTools \ Performance MMC?

Questions connexes