RegEnumValue liest nicht alle Werte
-
sodele jetzt meld ich mich nach einer ganzen weile mal wieder zurück.
folgenden Code habe ich geschrieben://------------------------------------------------------------------------------ #pragma hdrstop #include <stdio.h> #include <string.h> #include <windows.h> #include <conio.h> //------------------------------------------------------------------------------ const HKEY HLM = HKEY_LOCAL_MACHINE; const HKEY HCR = HKEY_CLASSES_ROOT; const HKEY HCU = HKEY_CURRENT_USER; const HKEY HU = HKEY_USERS; const MAX_PATH_ME = 500; struct my_datatype { char Pfad[MAX_PATH_ME]; }; //------------------------------------------------------------------------------ void scan_reg(HKEY section,char *key); //------------------------------------------------------------------------------ int main(int argc, char* argv[]) { scan_reg(HLM,"\0"); getch(); return 0; } //------------------------------------------------------------------------------ void scan_reg(HKEY section,char *key) { HKEY hKey; char keyName[MAX_PATH]; my_datatype *pfad=new my_datatype[5000]; if( RegOpenKeyEx(section, key, 0, KEY_ALL_ACCESS, &hKey ) == ERROR_SUCCESS ) { for(long i=0; RegEnumKey(hKey, i, keyName, MAX_PATH) == ERROR_SUCCESS; i++) { char key_long[MAX_PATH]=""; char val[500]=""; char val_val[500]=""; strcat(key_long,key); //alten string anhängen if(strcmp(key,"\0")!=0)strcat(key_long,"\\"); // backslash hinzufügen wenn der key nicht 0 ist (Stammkey) strcat(key_long,keyName); //neuen string anhängen //printf("%s\n",key_long); HKEY subKey; DWORD length=500; DWORD typ=REG_BINARY; if(RegOpenKeyEx(section, key_long, 0, KEY_ALL_ACCESS, &subKey) == ERROR_SUCCESS) { for(long b=0; RegEnumValue(subKey, b, val, &length, 0, 0, val_val, &length) == ERROR_SUCCESS; b++) { printf("%s - %s\n",val,val_val); } } scan_reg(section,key_long); // mit neuem string ausführen } RegCloseKey(hKey); } delete[] pfad; } //------------------------------------------------------------------------------allerdings liest der mir nicht alle reg schlüssel, sondern nur bestimmte, was ja nicht sein kann, da REG_BINARY gesetzt ist. (auch andere werte bringen keine besseren ergebnisse) lasst euch nicht von bestimmten sachen beinflussen, das programm ist noch net fertig und unnötiges zeug is auch drinne. bin ja noch ein nap, der zeug testen muss

MfG Radiation2k5
-
Hallo
so gehört das wohl ins WinAPI-Forum.
Im BCB verwendet man TRegistry.bis bald
akari
-
1. Du erzeugst Variablen in einer For-Schleife! Das ist nicht besonders clever.
2. Ich finde 2x RegKeyOpenEx, aber nur einmal RegCloseKey
3. Was heißt "nur bestimmte Keys". Kann man da eine Regel ableiten, die einem weiter hilft?
4. Ich sag nur Debugger!
Phips!
-
Dieser Thread wurde von Moderator/in junix aus dem Forum Borland C++ Builder (VCL/CLX) in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
ok ich hab jetzt auf eure antworten den code einmal nachbearbeitet, er sieht jetzt so aus:
//------------------------------------------------------------------------------ #pragma hdrstop #include <stdio.h> #include <string.h> #include <windows.h> #include <conio.h> //------------------------------------------------------------------------------ const HKEY HLM = HKEY_LOCAL_MACHINE; const HKEY HCR = HKEY_CLASSES_ROOT; const HKEY HCU = HKEY_CURRENT_USER; const HKEY HU = HKEY_USERS; const MAX_PATH_ME = 500; //------------------------------------------------------------------------------ void scan_reg(HKEY section, char *key); //------------------------------------------------------------------------------ int main(int argc, char* argv[]) { scan_reg(HCU,"\0"); getch(); return 0; } //------------------------------------------------------------------------------ void scan_reg(HKEY section, char *key) { HKEY hKey; HKEY subKey; char keyName[MAX_PATH]; char val[1500]=""; char val_val[1500]=""; char key_long[1500]=""; DWORD typ=REG_MULTI_SZ; DWORD length=1500; DWORD length_val=1500; if( RegOpenKeyEx(section, key, 0, KEY_ALL_ACCESS, &hKey ) == ERROR_SUCCESS ) { for(long i=0; RegEnumKey(hKey, i, keyName, MAX_PATH) == ERROR_SUCCESS; i++) { strcpy(key_long,"\0"); strcat(key_long,key); //alten string anhängen if(strcmp(key,"\0")!=0)strcat(key_long,"\\"); // backslash hinzufügen wenn der key nicht 0 ist (Stammkey) strcat(key_long,keyName); //neuen string anhängen printf("%s\n",key_long); if(RegOpenKeyEx(section, key_long, 0, KEY_ALL_ACCESS, &subKey) == ERROR_SUCCESS) { for(long b=0; RegEnumValue(subKey, b, val, &length, 0, &typ, val_val, &length_val) == ERROR_SUCCESS; b++) { printf("%s - %s - %i\n",val,val_val,b); getch(); //printf(""); } } RegCloseKey(subKey); scan_reg(section,key_long); // mit neuem string ausführen } RegCloseKey(hKey); } } //------------------------------------------------------------------------------allerdings kommt die schleife für RegEnumValue nie weiter als 0, an was liegt das? findet ihr noch rigendwelche fehler?
also ich hab nichts mehr gefunden, auch nicht im debug mode. (hab gestern 3 1/2 stunden daran rumgemacht)[EDIT] ach und die regel zum ableiten ist einfach, das er immer nur den index 0 ausführt [/EDIT]
MfG Radiation2k5
-
Lies dir nochmal die Hilfe zu RegEnumValue durch.
Die Funktion liefert dir nie die Anzahl der gefundenen Werte zurück, sondern versucht im angegebenen Registry-Zweig bei jedem Aufruf immer den nächsten Wert zu lesen. Im Rückgabewert kannst Du dann erkennen, ob noch ein Wert gefunden wurde (ERROR_SUCCESS) oder nicht (ERROR_NO_MORE_ITEMS). Also nicht mit einer For-Schleife arbeiten, sondern mit while.Grüße,
Phips!