Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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

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

Aha,

also ist lpData nicht groß genug gewählt. Was nehm ich da denn dann am Besten?

mfg

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?

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.

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

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.


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

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

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.