Biotecs Geschrieben 5. Februar 2004 Geschrieben 5. Februar 2004 Hallo, ich wollte versuchen einen Registry-Schlüssel auszulesen, welcher ein DWORD ist. Hab mir dafür die Funktion RegQueryValueEx rausgesucht. Leider bekomm ich es nicht hin, denn ich bekomm beim Vergleich immer ein True egal ob der Wert in der registry 0 oder 1 ist. Hat das vielleicht schon mal jemand erfolgreich gemacht? Mein Code sieht wie folgt aus: HKEY hkey; DWORD dwType = REG_DWORD; DWORD Encryption, EncLaenge; if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced", 0, KEY_ALL_ACCESS, &hkey) == ERROR_SUCCESS) { RegQueryValueEx(hkey, "EncryptionContextMenu", 0, $dwType, (LPBYTE)&Encryption, (LPDWORD)&EncLaenge); RegCloseKey(hkey); if (Encryption == 1) {...} } Das komische ist auch, wenn ich nach dem RegClose mir die Variable mit ShowMessage(Encryption); ausgeben lasse wird der Vergleich false. Sehr merkwürdig. Wenn jemand eine andere Lösung hat sowas aus der Registry auszulesen wäre das auch gut mfg Zitieren
Guybrush Threepwood Geschrieben 6. Februar 2004 Geschrieben 6. Februar 2004 Überprüf doch mal den Rückgabewert von RegQueryValueEx(), setz EncLaenge mal vor dem Aufruf auf sizeof(DWORD) und überprüfe nach dem Aufruf den Wert der drinsteht. Zitieren
Biotecs Geschrieben 6. Februar 2004 Autor Geschrieben 6. Februar 2004 Hi, also ein ShowMessage der RegQuery gibt 234 aus und das sizeof ganz normal 4. Versteh nicht warum die RegQuery sowas komisches zurückgibt. mfg Zitieren
Klotzkopp Geschrieben 6. Februar 2004 Geschrieben 6. Februar 2004 Quelle: MSDN If the buffer specified by lpData parameter is not large enough to hold the data, the function returns ERROR_MORE_DATA and stores the required buffer size in the variable pointed to by lpcbData. In this case, the contents of the lpData buffer are undefined. Übrigens: ERROR_MORE_DATA ist 234. ;-) Zitieren
Biotecs Geschrieben 6. Februar 2004 Autor Geschrieben 6. Februar 2004 Aha, also ist lpData nicht groß genug gewählt. Was nehm ich da denn dann am Besten? mfg Zitieren
Klotzkopp Geschrieben 6. Februar 2004 Geschrieben 6. Februar 2004 Ist der Wert überhaupt ein DWORD? Was steht vor dem Aufruf in EncLaenge, was danach? Zitieren
Biotecs Geschrieben 6. Februar 2004 Autor Geschrieben 6. Februar 2004 Der Wert in der Registry ist ein DWORD klar, falls du das meintest. Und was meinst du mit den Werten vorher und nachher? Vorher wird wohl 4 drin stehen, nachher auch, da wird doch eigentlich nichts zugewiesen. Und so wie ich das verstanden habe ist doch Encryption nicht groß genug oder? Zitieren
Guybrush Threepwood Geschrieben 6. Februar 2004 Geschrieben 6. Februar 2004 So wie du den Code oben hast wird da ein Zufallswert drinstehen. Du musst (wie ich oben bereits geschrieben habe) vor dem Aufruf von RegQueryValueEx() die Größe von lpData (also sizeof(DWORD)) in der Variable speichern. Nach dem Aufruf von RegQueryValueEx() steht darin die neue Größe von lpData (in diesem Fall natürlich immer noch sizeof(DWORD)) oder Null bei einem Fehler. Zitieren
Biotecs Geschrieben 6. Februar 2004 Autor Geschrieben 6. Februar 2004 das mit sizeof(DWORD) liefert mir auch nur eine 0. Ich denke das Problem liegt wohl daran wie die MSDN sagt, dass lpData sprich Encryption nicht groß genug ist für die Daten. Frage ist nur warum? Ich kann da kein LPDWORD nehmen, weil der dann anfängt von Konvertierungen von unsigned long zu unsigned char würden nicht gehen. Zitieren
Klotzkopp Geschrieben 6. Februar 2004 Geschrieben 6. Februar 2004 Original geschrieben von Biotecs das mit sizeof(DWORD) liefert mir auch nur eine 0.Was liefert 0? Der Aufruf von RegQueryValueEx? Dann hat's doch geklappt. Ich denke das Problem liegt wohl daran wie die MSDN sagt, dass lpData sprich Encryption nicht groß genug ist für die Daten. Frage ist nur warum?Du bist mit deinen Überlegungen auf dem Holzweg. Die Funktion kann die Größe des Puffers nicht aus dem Zeiger selbst entnehmen, sondern nur aus dem Wert, den du in EncLaenge übergibst. Wenn die Funktion mit ERROR_MORE_DATA zurückkommt, dann ist der Wert in EncLaenge zu klein. Wenn der wirklich 4 ist, dann ist auch der Puffer zu klein. Zeig doch bitte mal den aktuellen Code. Zitieren
Biotecs Geschrieben 6. Februar 2004 Autor Geschrieben 6. Februar 2004 HKEY hkey; DWORD Encryption; DWORD EncLaenge = sizeof(DWORD); if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced", 0, KEY_ALL_ACCESS, &hkey) == ERROR_SUCCESS) { RegQueryValueEx(hkey, "EncryptionContextMenu", 0, 0, (LPBYTE)&Encryption, &EncLaenge); RegCloseKey(hkey); if (Encryption == 1) {...} } Der if (Encryption...) Kram geht aber einfach nicht. Obwohl der Wert in der registry 1 ist. mfg Zitieren
Klotzkopp Geschrieben 7. Februar 2004 Geschrieben 7. Februar 2004 Welchen Wert gibt RegQueryValueEx bei diesem Code zurück? da wird doch eigentlich nichts zugewiesenDoch, das stand doch in dem MSDN-Auszug oben. Wenn der Puffer nicht groß genug ist, schreibt RegQueryValueEx die benötigte Puffergröße in die Variable, auf die lpcbData zeigt. Das ist in deinem Fall EncLaenge. Also: Was steht nach dem Aufruf in EncLaenge? Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.