Zum Inhalt springen

DWORD aus der registry lesen mit C++ Builder 6


Biotecs

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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. ;-)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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. :(

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen


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

Link zu diesem Kommentar
Auf anderen Seiten teilen

Welchen Wert gibt RegQueryValueEx bei diesem Code zurück?

da wird doch eigentlich nichts zugewiesen
Doch, 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? ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...