Registry Wert ändern - Vorgehensweise?



  • Hallo liebe Community.

    Ich habe mir schon die FAQ zum Thema Registry durchgelesen, bin aber im Bezug auf das Ändern von Werten etwas unschlüssig. Anscheinend gibt es keine vorgefertigte Funktion, mit welcher man z.B. einen Wert oder den Datentyp ändern kann. Meine Frage: wie kann ich jetzt vorgehen, um:

    • den Datentyp eines Keys zu änden
    • den Wert eines Keys umzubennen

    Ich bedanke mich für eure Antworten!
    Grüsse xbug



  • Hallo xbug

    Schau dir mal das an:
    --> http://msdn2.microsoft.com/en-us/library/ms724871.aspx
    Bin sicher das hilft dir weiter 😃

    MFG



  • Hallo! Ich habe dazu einen Codeschnipsel gefunden. Aber wie kann ich jetzt den Inhalt des Keys ausgeben?

    DWORD dwType;
    TCHAR szValue[100];
    DWORD dwSize = sizeof(szValue)*sizeof(TCHAR);
    LONG lRet = RegQueryValueEx(hKey, _T("key_bezeichnung"), NULL, &dwType, (LPBYTE) szValue, &dwSize);
    if ( (lRet == ERROR_SUCCESS) && ( (dwType == REG_SZ) || (dwType == REG_EXPAND_SZ)) )
    {
    }
    


  • Dürfte in szValue stehen.



  • Hallo, leider steht nix in der Variable. Ich code übrigens C++ (Konsolenapplikation).



  • Hallo xbug,

    hier ein Beispiel mit dem man die Start-Zeit aus der Registry auslesen kann.

    //...
    // Deklarationen von vorher
    
    HKEY hKey ;
    
    RegOpenKeyEx (HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows NT\\CurrentVersion", 0, KEY_SET_VALUE, &hKey);
    
    LONG lRet = RegQueryValueEx(hKey, _T("StartTime"), NULL, &dwType, (LPBYTE) szValue, &dwSize);
    
    RegCloseKey(hKey) ;
    
    // eventuelle Ausgabe (Sonst würde das Programm ja auch nichts nützen! ;-) )
    //...
    

    Dein Problem war, dass du gar keinen gültigen/initialisierten Handle zu dem Schlüssel hattest. Dies wurde nun mit der Funktion "RegOpenKey" getan. Nach dem Öffnen eines Schlüssels darf man aber das Schließen nicht vergessen und hierfür nimmst du die Funktion "RegCloseKey".

    Mit freundlichen Grüßen

    WilMen



  • Ja, danke! Hättest du denn noch eine Lösung für die Ausgabe?



  • Du sagtest du Programmierst in C++ eine Konsolen-Applikation.
    Also kannst du doch für die Ausgabe einfach "cout" oder (schon aus C bekannt) "puts" verwenden.

    //...
    
    cout << szValue << endl ; // oder
    puts(szValue) ;
    
    //...
    


  • Hi!

    Mein Compiler (Dev++) zeigt leider einen Fehler:

    17 C:\Dokumente und Einstellungen\Admin\Desktop\reg.cpp `dwType' undeclared (first use this function)



  • Denk doch auch mal selber ein bisschen nach.

    DWORD dwType;
    


  • @WebFritzi

    Jeder hat mal klein angefangen,...

    @xbug

    ...aber in meinem ersten Thread schrieb ich bereits, dass du die Deklarationen aus dem von dir geposteten Code-Abschnitt übernehmen sollst! 😉



  • Hey Jungs,

    leider werden mir nur kryptische Zeichen ausgegeben 😞 Hier mein Code:

    #include <conio.h>
    #include <windows.h>
    #include <stdio.h>
    #include <tchar.h> 
    #include <iostream> 
    
    using namespace std;
    
    int main(int argc, char *argv[]) {
    
    // #############
    
    HKEY hKey ;
    DWORD dwType;
    TCHAR szValue[100]; 
    DWORD dwSize = sizeof(szValue)*sizeof(TCHAR); 
    
    RegOpenKeyEx (HKEY_CURRENT_USER, "HKEY_CURRENT_USER\\AppEvents\\XXX_Key", 0, KEY_SET_VALUE, &hKey);
    
    LONG lRet = RegQueryValueEx(hKey, _T("EintragsName"), NULL, &dwType, (LPBYTE) szValue, &dwSize);
    
    RegCloseKey(hKey) ; 
    
    	printf(szValue);
    
    // ##############
    
    printf ("Press any key...");
    
    getch();
    
    return 0;
    
    }
    


  • RegOpenKeyEx(HKEY_CURRENT_USER, "AppEvents\\XXX_Key", 0, KEY_SET_VALUE, &hKey);
    


  • Hi, es geht leider immer noch nicht 😞



  • Dann benutze halt die CRegistry-Klase, die du auf meiner Homepage findest. Dann geht das so:

    CRegistry reg;
    reg.SetRoot(HKEY_CURRENT_USER);
    reg.OpenPath( TEXT("AppEvents\\XXX_Key") );
    
    TCHAR szValue[100];
    reg.ReadString(TEXT("EintragsName"), szValue, 100);
    


  • Du musst einfach das vierte Parameter von RegOpenKeyEx in KEY_READ ändern, dann klappt es. Sorry, das war mein Fehler, denn ich habe den Funktionsaufruf ja so gepostet. 😃

    Zeile 5 und 7 kannst du übrigens entfernen. Die brauchtst du in deinem Programm nicht!

    Mit freudlichen Grüßen

    WilMen



  • Also er zeigt jetzt nur noch ein Zeichen... Ein Smiley^^



  • Hallo xbug,

    also ich habe das Programm kompiliert und ausgeführt und alles hat geklappt. Ist der Schlüssel, dessen Wert du lesen möchtest, überhaupt schon erstellt?



  • Ja, ich habe es sogar mit einem anderen Key versucht 😞



  • #include <windows.h>
    #include <stdio.h>
    
    int main(int argc, char *argv[]) 
    {
     HKEY hkey; 
    
     char szBuffer[255];
     char KeyValue[255] ;
    
     unsigned long lBufferSize = 255;
    
     RegOpenKeyEx(HKEY_CURRENT_USER, "Control Panel\\Desktop", 0, KEY_READ, &hkey) ;
     RegQueryValueEx(hkey, "MenuShowDelay", NULL, NULL, KeyValue, &lBufferSize) ;
     RegCloseKey(hkey) ; 
    
     printf("Wert des Schluessels: %s",KeyValue, "\n\nPress any key...") ;
     getchar() ;
    
     return (0);
    }
    

    Kompiler mal dieses Code. Ich habe ihn mit dem "Dev-C++ 4.9.9.2" kompiliert und es funktioniert!

    Sollte es jetzt immer noch nicht funktionieren, dann muss es am Compiler liegen!


Anmelden zum Antworten