Registry (mal wieder)
-
Hallo,
(hoffentlich bin ich hier richtig)
folgende Frage zu den Registry Funktionen. Ich will aus der Registry Werte mit einem bestimmten Namen auslesen, kenne aber den kompletten Pfad nur teilweise.also zB.:
Ich will den Wert "test" auslesen der als REG_BINARY vorliegt.
Hierachie sieht wie folgt aus.HKEY_CURRENT_USER
|- Software
|-|-Schlüssel1
|-|-|-Subschlüssel
|-|-|-|-Subsubschlüssel1 <- da ist ein test drin
|-|-|-|-Subsubschlüssel2 <- da auch
|-|-|-Subschlüssel2
|-|-|-|-Subsubschlüssel3 <- hier nicht
|-|-|-|-Subsubschlüssel4 <- hier schon
|-Schlüssel2
usw.Ich kenne folgenden Pfad ... HKEY_CURRENT_USER/Software/Schlüssel1 ... und meine Werte die mich interresieren stehen in Subsubschlüssel1, Subsubschlüssel2, Subsubschlüssel3 und Subsubschlüssel4, können aber eventuell auch mehr oder weniger sein, das weiß ich vorher nie genau. Es gibt aber minderstens immer einen Subschlüssel der einen Subsubschlüssel besitzt der dann den Wert "test" hat.
Nun meine Idee
code#define BUFSIZE x // x steht für ne Zahl die ich nich genau kenne :D char result[BUFSIZE]; long lret; HKEY hKey1, hKey2; DWORD dwBufLen=BUFSIZE; int i=0, j=0; int iLastError=0, jLastError=0; int zaehler_gefunden=0, zaehler_nichtGefunden=0; // ich öffne den Pfad den ich kenne lRet = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\Schlüssel1", 0, KEY_QUERY_VALUE, &hKey1); if( lRet != ERROR_SUCCESS ) // mach was ... Fehlermeldung usw. do { char cName1[256] = ""; iLastError = 0; DWORD dwData = 256; iLastError = RegEnumKeyEx(hKey1,i,cName1,&dwData,0,0,0,0); ++i; // so nun müsste ich ja die einzelnen Subschlüsselnamen haben/bekommen // und in der nächsten do while suche ich mir dann die Subsubschlüsselnamen von den Subschlüsseln CString Pfad; Pfad.Format("Software\Schlüssel1\%s", cName1); do { // vorher neues HKEY holen lRet = RegOpenKeyEx(HKEY_CURRENT_USER, Pfad, 0, KEY_QUERY_VALUE, &hKey2); char cName2[256] = ""; jLastError = 0; DWORD dwData = 256; iLastError = RegEnumKeyEx(hKey,j,cName2,&dwData,0,0,0,0); ++j; // nun meinen Wert "test" auslesen lReg = RegQueryValueEx( HKEY_CURRENT_USER, "test", NULL, REG_BINARY, (LPBYTE) result, &dwBufLen) // prüfen obs erfolgreich war if (lRet == ERROR_SUCCESS) { // nun kommt das schwierige ... von dem langen REG_BINARY interresieren // mich nur 2 Zahlen, ob die 00 sind if ((result[y] == '0') && (result[y+1] == '0')) { zaehler_gefunden++; // wieviele Werte enthalten den das was man sucht } else { zaehler_nichtGefunden++; // wieviele Werte enthalten es nicht } } }while(jLastError!=ERROR_NO_MORE_ITEMS); }while(iLastError!=ERROR_NO_MORE_ITEMS);Zum überprüfen ... also im Prinzip interresiert mich nur ob an der Stelle von dem REG_BINARY die mich interresiert 00 steht wenn nich soll er soweiso nix machen bzw. es interresiert mich wieviele der gefundenen Werte das entahlten was ich suche und wieviele nicht.
Ich weiß auch nicht ob das so überhaupt geht, das man nen REG_BINARY in ein char[] macht?
Mein Wert sieht ungefähr so aus, also von der Länge her
"Wert" =hex:00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,44,3a,5c,57,49,4e,4e,54,5c,50,72,6f,66,69,6c,65,73,5c,73,68,61,79,\
63,5c,41,70,70,6c,69,63,61,74,69,6f,6e,20,01,18,00,06,04,00,10,0f,3c,00,00,\
18,19,19,19,18,18,18,18,18,18,18,18,18,18,18(das fette interresiert mich)
und es interresiert mich eigentlich nur eine bestimte Stelle, ich lese aber trotzdem alles ... nicht gut oder (wenn es überhaupt so geht)???
Außerdem weiß ich nicht ob eventuell die Komma mitgelesen werden, deshalb auch das x für BUFSIZE. Mein Hauptproblem ist halt das ich nicht weiß wie ich auf Schlüssel zugreife deren Pfad ich nicht kenne und wie ich dann das REG_BINARY am besten auslese und auswerte ... also im Prinzip weiß ich nichts ^^Ausprobiert hab ich das noch nicht, weil mir bitte erst wer bestätigen soll, das ich damit nix kaputt machen kann an der Registry

MfG
eMpTy
PS: Das ich Anfänger bin brauch ich nicht extra zu erwähnen oder :? und das Namen wie hKey1 und hKey2 schlecht sind weiß ich auch ^^
-
Ich denke nicht, dass die Kommata mit ausgelesen werden, aber wenn ich die Doku richtig verstanden habe, musst du immer alles auslesen.
Solange du nur ausliest und enums machst kann eigentlich nichts kaputtgehen
-
OK
... thxhab ja einige Fehler im Code wie zb. ; vergessen usw. ;/
wollte das ganze jetzt ausprobieren, aber irgendwie erkennt er REG_BINARY nicht ... ich hoffe mal REG_BINARY entspicht 3 (zuminderst dachte ich das irgendwo gesehen zu haben) ... wo könnte ich das nachlesen ???
-
Bei RegQueryValueEx kannst du da einfach NULL angeben - ansonsten einen Pointer, so wie es in der Doku steht:
[out] Pointer to a variable that receives a code indicating the type of data stored in the specified value. For a list of the possible type codes, see Registry Value Types. The lpType parameter can be NULL if the type code is not required.
-
Besteht dabei aber nicht die gefahr (wenn ich nicht angebe was da für nen Typ steht) das ich eventuell "Müll" erhalte ... ???
Ich speichere das ganze ja sowieso in dem char[] aber ich stell mir das halt so vor das er das was er dort findet dann einfach nimmt und umwandelt in char.
also das dann etwa 00 als A interpretiert wird ... oder so ähnlich ???
Es gibt glaub ich ne Funktion die dir den Typ angibt, aber wenn die sowieso jedesmal verwendet wird wieso sollte man den dann überhaupt angeben?
-
Du hast das offenbar nicht ganz richtig verstanden: in diesem Parameter kannst du einen Pointer angeben, über den dir dann gesagt wird, um was für Daten es sich handelt, die du da gerade ausgelesen hast. Da du daran aber nicht interessiert bist, weil du ja weißt, was es für Daten sind, kannst du einfach NULL angeben. Beim Schreiben ist das aber wieder was anderes...