Regestry



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



  • 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


Anmelden zum Antworten