Regestry



  • 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 anlegen

    else
    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



  • 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.


Anmelden zum Antworten