Regestry
-
KEY_ALL_ACCESS
Wunder Dich nicht, wenn ein Benutzer ohne Adminrechte Dein Programm benutzt, und es nicht funktioniert!
- Du prüfst nicht, ob RegOpenKeyEx fehlschlägt (was beim "normalen" Benutzer mit KEY_ALL_ACCESS definitiv fehlschlägt)!
- Den (evtl. ungültigen) hKey benutzt Du einfach so, egal ob es ein gültiger Handle ist
- Selbiges bei RegSetValueEx -> hKey wird nicht auf Gültigkeit überprüft!
-
So wie dein Code derzeit ausseiht ist das 2. RegOpenKeyEx überflüssig / falsch bzw. es fehlt ein RegCloseKey.
Falls du den Schüssel zuerst nur mit Lese-Berechtigung öffnest ist ein zweiter Aufruf von RegOpenKeyEx mit Schreib-Berechtigung schon ok, allerding fehlt dann eben wie gesagt das RegCloseKey für den 1. Aufruf von RegOpenKeyEx
-
vielleicht hab ich glück und hab die rechte;-)
cu
-
ich hab das nun so geändert:
HKEY hkey; HKEY KEY = HKEY_LOCAL_MACHINE; char place[100]= {"Software\\Microsoft\\Windows\\CurrentVersion\\Run"}; char name[100]= {"Programm"}; char value[100]= {"C:\\Temp\\Programm.exe"}; RegOpenKeyEx(KEY,(LPCTSTR)place,0, KEY_ALL_ACCESS,&hkey); long rOpen = RegQueryValueEx(hkey,name,0,0,0,0); RegCloseKey(hkey); // Überprüfen ob der Schlüssel in der Registry schon vorhanden ist if(rOpen != ERROR_SUCCESS) { // In die Registry eintragen RegOpenKeyEx(KEY,(LPCTSTR)place,0, KEY_ALL_ACCESS,&hkey); RegSetValueEx(hkey, name, 0, REG_SZ, (BYTE *)value, strlen(value)); ShowMessage("Schlüssel neu angelegt"); RegCloseKey(hkey); }
wie kann ich folgendes prüfen, ich glaub ich hab einen error:
- prüfen, ob RegOpenKeyEx fehlschlägt
- Den (evtl. ungültigen) hKey benutzt Du einfach so, egal ob es ein gültiger Handle ist
- RegSetValueEx -> hKey auf Gültigkeit prüfen!cu surf..
-
- KEY_ALL_ACCESS endlich durch KEY_READ bzw. KEY_WRITE ersetzen.
- Auch die Funktion RegOpenKeyEx hat einen Rückgabewert, nachzulesen in der MSDN
-
hi.....meinst du so??
passt das nun oder was soll ich noch machen??HKEY hkey; HKEY KEY = HKEY_LOCAL_MACHINE; char place[100]= {"Software\\Microsoft\\Windows\\CurrentVersion\\Run"}; char name[100]= {"Programm"}; char value[100]= {"C:\\Temp\\Programm.exe"}; RegOpenKeyEx(KEY,(LPCTSTR)place,0, KEY_READ,&hkey); long rOpen1 = RegQueryValueEx(hkey,name,0,0,0,0); RegCloseKey(hkey); // Überprüfen ob der Schlüssel in der Registry schon vorhanden ist if(rOpen1 != ERROR_SUCCESS) { // In die Registry eintragen long rOpen2 = RegOpenKeyEx(KEY,(LPCTSTR)place,0, KEY_WRITE,&hkey); if(rOpen2 != ERROR_SUCCESS) { ShowMessage("Fehler beim schreiben in die Registry"); } else { RegSetValueEx(hkey, name, 0, REG_SZ, (BYTE *)value, strlen(value)); ShowMessage("Schlüssel neu angelegt"); } RegCloseKey(hkey); } }
cu surf.
-
Du prüfst immer noch nicht, ob RegOpenKeyEx fehlschlägt oder nicht (zumindest nicht beim ersten Aufruf vor RegQueryValueEx), stattdessen gehst Du einfach davon aus, das es immer funktioniert (und benutzt den möglicherweise ungültigen hKey einfach so).
-
wie überprüfe ich ob RegOpenKeyEx fehlschlägt??? wie überprüfe ich einen ungültigen hKey??? bitte danke!
cu
-
HKEY hkey; HKEY KEY = HKEY_LOCAL_MACHINE; char place[100]= {"Software\\Microsoft\\Windows\\CurrentVersion\\Run"}; char name[100]= {"Programm"}; char value[100]= {"C:\\Temp\\Programm.exe"}; long rOpen1 = RegOpenKeyEx(KEY,(LPCTSTR)place,0, KEY_READ,&hkey); long rQuery1 = RegQueryValueEx(hkey,name,0,0,0,0); RegCloseKey(hkey); // Überprüfen ob der Schlüssel in der Registry schon vorhanden ist if(rOpen1 != ERROR_SUCCESS && rQuery1 != ERROR_SUCCESS) { // In die Registry eintragen long rOpen2 = RegOpenKeyEx(KEY,(LPCTSTR)place,0, KEY_WRITE,&hkey); if(rOpen2 != ERROR_SUCCESS) { ShowMessage("Fehler beim Schreiben in die Registry"); } else { RegSetValueEx(hkey, name, 0, REG_SZ, (BYTE *)value, strlen(value)); ShowMessage("Schlüssel neu angelegt"); } RegCloseKey(hkey); } }
passt das so???
cu surf
-
HKEY hkey; char place[]= "Software\\Microsoft\\Windows\\CurrentVersion\\Run"; char name[] = "Programm"; char value[]= "C:\\Temp\\Programm.exe"; long rQuery, rOpen; rOpen = RegOpenKeyEx(HKEY_LOCAL_MACHINE, (LPCTSTR)place, 0, KEY_READ, &hkey); if(rOpen == ERROR_SUCCESS) { // Registry konnte geöffnet werden! Somit ist hKey gültig! rQuery = RegQueryValueEx(hkey, name, 0, 0, 0, 0); if(rQuery != ERROR_SUCCESS) { //Key existiert noch nicht! RegCloseKey(hkey); // In die Registry eintragen rOpen = RegOpenKeyEx(HKEY_LOCAL_MACHINE, (LPCTSTR)place, 0, KEY_WRITE, &hkey); if(rOpen != ERROR_SUCCESS) { ShowMessage("Fehler beim Schreiben in die Registry"); } else { RegSetValueEx(hkey, name, 0, REG_SZ, (BYTE *)value, strlen(value)); RegCloseKey(hKey); ShowMessage("Schlüssel neu angelegt"); } } else RegCloseKey(hkey); } else ShowMessage("Fehler beim Öffnen der Registry"); //Man könnte nun mit GetLastError den Grund abfragen
-
hi!! danke!!
aber wenns den eintrag in der registry schon gibt dann kommt fehler beim auslesen der registry!!!??? ist das gewollt?cu surf
-
Du hast zu früh geguckt, war noch nicht fertig...
Habs korrigiert...
-
wer er einen neuen schlüssel anlegt dann bekomm ich access violation!!?????
cu
-
else RegCloseKey(hkey); } else ShowMessage("Fehler beim Öffnen der Registry"); //Man könnte nun mit GetLastError den Grund abfragen
das RegCloseKey(hkey); gehört da raus!!! oder?
cu
-
Warum? Du mußt doch den geöffneten Key wieder schließen... Wo bekommst Du denn die Access-Violation?
-
du hast 2 mal RegOpenKeyEx!!!
und bei dir 3 mal RegCloseKey!!!
das kann ja nicht gehn!!cu
-
Au Mann...
Die Bedeutung von if.. else... ist Dir aber schon bewußt, ja?
-
aber was nützt das wenn ich einen access voilation error bekomme
-
Wenn Du in der Lage bist if... else... aufzulösen, dann macht Dein voriger Satz, ich zitiere:
du hast 2 mal RegOpenKeyEx!!!
und bei dir 3 mal RegCloseKey!!!
das kann ja nicht gehn!!gar keinen Sinn...
und wenn Du lesen könntest, würdest Du den kleinen Schreibfehler bei RegCloseKey(hKey); selber entdecken... zumal Dein Compiler da meckern müßte...
Und nochwas:
Auf meinem System gibt es hier mit exakt demselben Code keine Access-Violation, auch nicht wenn er den Schlüssel neu anlegt!
-
HKEY hkey; char place[]= "Software\\Microsoft\\Windows\\CurrentVersion\\Run"; char name[] = "Programm"; char value[]= "C:\\Temp\\Programm.exe"; long rQuery, rOpen; rOpen = RegOpenKeyEx(HKEY_LOCAL_MACHINE, (LPCTSTR)place, 0, KEY_READ, &hkey); if(rOpen == ERROR_SUCCESS) { // Registry konnte geöffnet werden! Somit ist hKey gültig! rQuery = RegQueryValueEx(hkey, name, 0, 0, 0, 0); if(rQuery != ERROR_SUCCESS) { //Key existiert noch nicht! RegCloseKey(hkey); // In die Registry eintragen rOpen = RegOpenKeyEx(HKEY_LOCAL_MACHINE, (LPCTSTR)place, 0, KEY_WRITE, &hkey); if(rOpen != ERROR_SUCCESS) { ShowMessage("Fehler beim Schreiben in die Registry"); RegCloseKey(hkey); } else { RegSetValueEx(hkey, name, 0, REG_SZ, (BYTE *)value, strlen(value)); RegCloseKey(hkey); ShowMessage("Schlüssel neu angelegt"); } } } else { ShowMessage("Fehler beim Öffnen der Registry"); //Man könnte nun mit GetLastError den Grund abfragen }
so das müsste passen!!
danke no mal!!
cu