Regestry
-
Möglicherweise die Lösung: http://www.c-plusplus.net/forum/viewtopic.php?t=39176
-
wenn ich wüsste was da genau gemacht wird*g*
dann wäre ich zufrieden...hmm...
scheißt grösser zu sein das problem als gedacht.....;-(
-
Lies dir das doch mal genau durch. Dann wirste's auch schaffen!
-
hab 2 varianten:
// In die Registry schreiben: mit TRegistry TRegistry* reg = new TRegistry; reg->RootKey = HKEY_LOCAL_MACHINE; reg->OpenKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run", false); reg->WriteString("Programm", "C:\\Temp\\Programm.exe"); reg->CloseKey(); delete reg; // In die Registry schreiben: mit Winapi 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); RegSetValueEx(hkey, name, 0, REG_SZ, (BYTE *)value, strlen(value)); RegCloseKey(hkey);
so wie kann ich rausfinden das es den schlüssel schon gibt....will nicht immer überschreiben!!!
cu
-
ich meine, du müsstest ihn dazu versuchen auszulesen: RegQueryValueEx
-
[msdn]RegQueryValueEx[/msdn]
-
@surf: Du regst mich langsam auf. Erst sagt du, du hast Probleme mit Admin-Rechten, und jetzt geht es plötzlich doch???
-
ich hab no immer das problem mit admin recht.....nur das reinschreibn geht wenn ich admin bin...sonst ebn nicht!!!
ich will die registry auslesen ob der schlüssel schon vorhanden ist:
mach i das so:???????DWORD dwData = 256; BYTE cDaten[256] = ""; RegQueryValueEx(hKey,"Programm",0,0,cDaten,&dwData2);
cu
-
die letzten beiden Parameter könntest du auch noch auf NULL bzw. 0 setzen
-
DWORD dwData = 256;
BYTE cDaten[256] = "";
RegQueryValueEx(hKey,"Programm",0,0,0,0);wie kann ich jetzt rausfinden obs den schlüssel schon gibt?????
if(......kein schlüssel
dann schlüssel anlegenelse
keinen schlüssel anlegen da schlüssel schon vorhanden ist!!!!!!!!!!!
-
indem du den Rückgabewert überprüfst (ERROR_SUCCESS wenn alles glatt ging)
-
DWORD dwData = 256;
int iLastError = 0;
HKEY hkey;
HKEY KEY = HKEY_LOCAL_MACHINE;BYTE cDaten[256] = "";
iLastError = RegQueryValueEx(hKey,"Programm",0,0,0,0);if(!iLastError) // Wenn noch nicht in die Registry eingetragen wurde dann...
{
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);
RegSetValueEx(hkey, name, 0, REG_SZ, (BYTE *)value, strlen(value));
RegCloseKey(hkey);
}
-
DWORD dwData = 256; HKEY hkey; HKEY KEY = HKEY_LOCAL_MACHINE; BYTE cDaten[256] = ""; long rOpen = RegQueryValueEx(hKey,"Programm",0,0,0,0); // warum sind die Parameter am Schluss alle 0 ??? // Wenn noch nicht in die Registry eingetragen wurde dann... if(rOpen != ERROR_SUCCESS) { 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); RegSetValueEx(hkey, name, 0, REG_SZ, (BYTE *)value, strlen(value)); RegCloseKey(hkey); }
-
Das RegOpenKeyEx müsste imho vor RegQueryValueEx stehen.
Warum sind alle Parameter NULL?: ganz einfach - du bist nicht an den Daten interessiert, sondern willst nur wissen, od der Wert existiert- cDaten brauchst du also gar nicht
-
ok ich glaub so passt es oder?
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); // Ü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)); } RegCloseKey(hkey);
kann man deiner meinung sonst noch was verbessern?
cu
-
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