Avatar billede viht Nybegynder
11. november 2002 - 09:12 Der er 10 kommentarer og
1 løsning

Perflib

Er der nogen af jer der har erfaring med brug af perflib i windows nt? Registerværdien indeholder en mængde informationer om diverse tællere i systemet. Registreringsværdien er af type REG_SZ_MULTI, som jeg ikke ved hvordan læses. Er der nogen der har noget kode der benytter sig af perflib? Det skal være kompilerbart vha gcc.

Det er her:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib
Avatar billede viht Nybegynder
11. november 2002 - 09:14 #1
Undskyld, værdien er af typen: REG_MULTI_SZ.
Avatar billede kamikaze Nybegynder
11. november 2002 - 09:51 #2
Hmmm...Jeg sidder på en win2k maskine, og der er typen af nøglen HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\Default == REG_SZ og ikke REG_MULTI_SZ. De øvrige nøgler er af typen REG_DWORD. Derudover er der en mappe der hedder 009.... Ser det nogenlunde sådan ud for dig også???
Avatar billede kamikaze Nybegynder
11. november 2002 - 09:52 #3
REG_MULTI_SZ == An array of null-terminated strings, terminated by two null characters.

Dvs. du læser bare indtil du støder på en dobbelt nul-terminering
Avatar billede viht Nybegynder
11. november 2002 - 09:56 #4
Jeg har mapperne 006 og 009 hvor 006 indeholder værdierne på dansk og 009 indeholder dem på engelsk.
Avatar billede kamikaze Nybegynder
11. november 2002 - 10:03 #5
Men er du sikker på at de er af typen REG_MULTI_SZ? Og er det Win2k eller NT4 eller ?
Avatar billede viht Nybegynder
11. november 2002 - 10:07 #6
Windows XP, de er af værdien REG_MULTI_SZ i begge mapper. Jeg skal bruge et eksempel på en implementation af det her. Jeg har læst nogle forskellige sider at man først skal aktivere brugen af tællerne før de bliver aktiveret.. jeg har dog ikke kunnet finde eksempler.

Du kender måske www.samurize.com? Der bruger de disse tællere, det er i hvert fald de tællere der er repræsenteret i registreringsdatabasen de stiller til rådighed i programmet. Desværre er det ikke open source.
Avatar billede kamikaze Nybegynder
11. november 2002 - 11:56 #7
Jeg kender ikke det site. Men er det ikke bare at læse nøglernes værdi? Altså RegOpenKey() og RegQueryValueEx() du skal bruge????
Avatar billede kamikaze Nybegynder
11. november 2002 - 11:56 #8
Hvis du skal bruge eksempler på brugen af disse har jeg kode liggende, men jeg har ikke tid til at lave specifik kode idag...
Avatar billede viht Nybegynder
11. november 2002 - 12:50 #9
Det er ikke måden at gøre det på.. jeg kan sagtens læse værdierne af nøglerne. Der findes en metode for at læse disse tællere ind i et objekt eller lignende. Jeg har mailet crewet bag samurize og vender tilbage hertil.
Avatar billede viht Nybegynder
11. november 2002 - 12:53 #10
Problemet med at læse værdierne direkte er at de endnu ikke er aktiverede.. de ændrer ikke værdi.
Avatar billede viht Nybegynder
12. november 2002 - 11:59 #11
Nu har jeg så selv fundet ud af det.. hvis andre skulle have interesse i det er koden nedenfor. Denne stump kode viser en control med alle tællerne i systemet og printer den valgte counter i et predefineret interval.

// Du skal linke med pdh.lib og det virker desværre kun i Visual C++ :(

#include <windows.h>
#include <string>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
#include <pdh.h>

#define SAMPLE_INTERVAL_MS  1000
#define MAXPATH 80

void main() {

  HQUERY          hQuery;
  HCOUNTER        *pCounterHandle;
  PDH_STATUS      pdhStatus;
  PDH_FMT_COUNTERVALUE  fmtValue;
  DWORD          ctrType;
  SYSTEMTIME      stSampleTime;
  PDH_BROWSE_DLG_CONFIG  BrowseDlgData;
  CHAR            szPathBuffer[MAXPATH];
  int            nRetCode = 0;

  // Open the query object.
  pdhStatus = PdhOpenQuery (0, 0, &hQuery);

  // Allocate the counter handle array. Allocate room for
  //  one handle per command line arg, not including the
  //  executable file name.
  pCounterHandle = (HCOUNTER *)GlobalAlloc(GPTR, sizeof(HCOUNTER));
  // Zero the contents of the structure.
  memset (&BrowseDlgData, 0, sizeof(PDH_BROWSE_DLG_CONFIG));

  // Initialize the browser dialog window settings.
  BrowseDlgData.bIncludeInstanceIndex = FALSE; 
  BrowseDlgData.bSingleCounterPerAdd = TRUE;
  BrowseDlgData.bSingleCounterPerDialog = TRUE; 
  BrowseDlgData.bLocalCountersOnly = FALSE;     
  BrowseDlgData.bWildCardInstances = TRUE;
  BrowseDlgData.bHideDetailBox = TRUE;
  BrowseDlgData.bInitializePath = FALSE;   
  BrowseDlgData.bDisableMachineSelection = FALSE;
  BrowseDlgData.bIncludeCostlyObjects = FALSE;
  BrowseDlgData.bReserved = TRUE;
  BrowseDlgData.hWndOwner = NULL; 
  BrowseDlgData.bReserved = FALSE;         
  BrowseDlgData.szReturnPathBuffer = szPathBuffer;
  BrowseDlgData.cchReturnPathLength = MAXPATH;;
  BrowseDlgData.pCallBack = NULL; 
  BrowseDlgData.dwCallBackArg = 0;
  BrowseDlgData.CallBackStatus = ERROR_SUCCESS;
  BrowseDlgData.dwDefaultDetailLevel = PERF_DETAIL_WIZARD;
  BrowseDlgData.szDialogBoxCaption = "Select a counter to monitor.";

  // Display the counter browser window.
  pdhStatus = PdhBrowseCounters (&BrowseDlgData);

  pdhStatus = PdhAddCounter (hQuery,
                              szPathBuffer,
                              0,
                              pCounterHandle);

  // "Prime" counters that need two values to display a
  //  formatted value.
  pdhStatus = PdhCollectQueryData (hQuery);

  // Print counter values until a key is pressed.
  while (!_kbhit()) {

    Sleep(SAMPLE_INTERVAL_MS);

    GetLocalTime (&stSampleTime);

    pdhStatus = PdhCollectQueryData (hQuery);

    pdhStatus = PdhGetFormattedCounterValue (*pCounterHandle,
                                              PDH_FMT_DOUBLE,
                                              &ctrType,
                                              &fmtValue);

    if (pdhStatus == ERROR_SUCCESS) {
        printf ( "Data: [%.3g]\n", fmtValue.doubleValue);
    } else {

        // Print the error value.
        printf("-1");
    }
  }

  // Close the query.
  pdhStatus = PdhCloseQuery (hQuery);

}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester