RegQueryValueEx



  • Kann mir jemand ein konkretes Beispiel geben, wie man einen DWORD-Wert aus der Registery auslesen kann.
    Ich bin zwar der Meinung, dass mein Weg funktioniert hat, aber das ist schon ne Weile her, dass ich ein bisschen unsicher bin.

    DWORD Wert = 0, TWert = 0, szWert = 0;
    
    RegQueryValueEx (hKey_App, "AS3_Port", 0, &TWert, (BYTE*)&Wert, &szWert);
    

    Ich muss dazu noch sagen, dass ich das damals auf einer XP-Maschine geschrieben habe, jetzt aber mit 2000 arbeite. Kann das daran liegen, oder nicht?





  • Ich hab meine Zeilen dem Beispiel aus der FAQ angepasst.

    Funktioniert trotzdem nicht. In der Registery steht an der Stelle, die ich auslesen will, 0xffffffff, Wert gibt aber 0 zurück. 😕



  • Wie sieht denn dann dein Code jetzt aus?



  • Wenn ich mich recht erinnere ging das so:

    DWORD Wert = 0, TWert = REG_DWORD, szWert = sizeof(DWORD);
    
    RegQueryValueEx( hKey_App, "AS3_Port", 0, &TWert, (BYTE*)&Wert, &szWert);
    

    Dein Var. TWert war auf NULL sie muss aber auf 'REG_DWORD' (4 statt 0) => 32-bit number



  • @flenders:
    Sieht genauso aus, wie ihn Basis_2 gepostet hat.

    Dennoch funktioniert es nicht. Das komische ist, dass ich ohne Probleme auf den Schlüssel schreiben kann. (HKEY_CURRENT_USER\sofware\myApp\..) 😕
    Von den Rechten her öffne ich den Schlüssel mit KEY_ALL_ACCESS. Ich hab allerdings auch schon KEY_READ|KEY_WRITE probiert.

    Also, was ist da faul?



  • RegQueryValueEx liefert einen LONG-Wert zurück.

    Return Values
    If the function succeeds, the return value is ERROR_SUCCESS.

    If the function fails, the return value is a nonzero error code defined in Winerror.h. You can use the FormatMessage function with the FORMAT_MESSAGE_FROM_SYSTEM flag to get a generic description of the error.

    Welchen Wert liefert sie denn zurück?
    Kann dann ja wohl kaum ERROR_SUCCESS sein, oder?



  • Ich hab die Lösung gefunden.

    Vorher habe ich den Schlüssel so geholt:

    Error = RegCreateKeyEx (hKeySoftware, "myApp\\Ports", 0, "", 0, KEY_ALL_ACCESS,     
        NULL, &myApp->hKey_myAppPorts, &Result);
    

    Jetzt hab ich die ganze Geschichte gesplittet:

    Error = RegCreateKeyEx (hKeySoftware, "myApp", 0, "", 0, KEY_ALL_ACCESS,
        NULL, &myApp->hKey_myApp, &Result);
    
    Error = RegCreateKeyEx (myApp->hKey_myApp, "Ports", 0, "", 0, KEY_ALL_ACCESS,
        NULL, &myApp->hKey_Ports, &Result);
    

    Ich sollte auch noch erwähnen, dass NT/2000 beim Auslesen von 0xffffffff nicht wie bei XP -1 sondern 4294967295 zurückgibt. (Kann man schon mit RegEdit sehen.)



  • KEY_ALL_ACCESS ist allerdings sehr gefährlich... Du verlangst da Rechte, die Du unter Umständen gar nicht hast. Dann scheitert selbst das Lesen des Keys...

    KEY_ALL_ACCESS sagt zum System:
    Ich will löschen.
    Ich will schreiben.
    Ich will lesen.
    usw.

    Hast Du auch nur eins dieser Rechte nicht (löschen z. b.), schlägt die Funktion fehl, auch wenn Du nur lesen willst...



  • Ja, ich weiss. Allerdings bekomme ich KEY_ALL_ACCESS unter HKEY_CURRENT_USER immer, soweit ich weiss. Für den Fall, dass es mal nicht klappt, hab ich auch Ausweichroutinen. Und an den Stellen, wo ich eh nur den Wert haben will, gehe ich auch mit KEY_QUERY_VALUE rein.

    Kannst du mir vielleicht erklären, warum die ganze Sache gesplittet funktioniert und gesammelt nicht?



  • Sicher.

    Wenn Du mit KEY_ALL_ACCESS auf einen Schlüssel zugreifst, sagst Du damit dem System quasi "Ich will lesen UND schreiben UND löschen usw.".

    KEY_ALL_ACCESS sagt nicht "ich will dies oder das oder das".

    Wenn Dein User (der ja nicht immer ein Administrator sein muß) nun z. B. keine Schreibrechte in die Registry/in den Key besitzt, schlägt der komplette Aufruf fehl, weil Du ja gesagt hast: "Ich brauche alle diese Zugriffe!"

    Sagst Du nun aber KEY_READ, dann schaut das System auch nur, ob der User Leserechte hat (was im allgemeinen der Fall ist) und die Funktion läuft erfolgreich durch.

    Deshalb sollte man bei Zugriffsrechten immer nur die angeben, die man auch wirklich braucht. Genauso z. B. bei Prozessen. Da kann man auch PROCESS_ALL_ACCESS angeben. Beinhaltet ALLES, was man mit einem Prozess anstellen kann (terminieren, neu erstellen, Info auslesen usw.).

    Wenn Du z. B. nur herausfinden möchtest, in welcher Priorität der Prozess läuft, rufst Du am besten mit PROCESS_QUERY_INFORMATION auf, denn was willst Du mit PROCESS_TERMINATE Rechten, wenn Du sie eh nicht brauchst und wahrscheinlich nicht mal hast...



  • Maffe001 schrieb:

    Kannst du mir vielleicht erklären, warum die ganze Sache gesplittet funktioniert und gesammelt nicht?

    Afaik kannst du pro Aufruf immer nur eine neue Ebene erstellen (also nicht auf einmal 5 Unterschlüssel erstellen) - evtl. liegts daran 🙄



  • @Hepi:
    Ja, na gut, ich geb mich geschlagen. 🙂 Sicherlich, wozu sollte ich mir alle Rechte sichern, wenn ich eh nur einen kleinen Teil davon brauche.
    Ich werde meinen Code in die Richtung noch optimieren.

    @flenders:
    Stimmt daran könnte es liegen. Ich bin nur der Meinung, wenn es solche gravierenden Unterschiede zw. XP und 2000 gibt, dann sollte das auch wenigstens in der Online-MSDN stehen.

    Danke. 😃



  • Hattest du den Ordner damals evtl. manuell zuvor angelegt gehabt?!



  • Nein, hatte ich nicht gemacht. Ich bin mit RegCreateKeyEx(..) rangegangen, weil das wie ein RegOpenKeyEx(..) reagiert, wenn der Schlüssel vorhanden ist. Über den letzten Parameter in RegCreateKeyEx(..) kann man überprüfen, ob neu angelegt wurde oder nicht. 😃


Anmelden zum Antworten