Problem mit RegQueryValueEx

Diskutiere Problem mit RegQueryValueEx im Developer Network Forum im Bereich Hardware & Software Forum; Hi, ich habe gerade ein Programm geschrieben, welches einen Registry-Eintrag schreibt. Alles Ok! Nun will ich aber den Eintrag auch wieder...
  • Problem mit RegQueryValueEx Beitrag #1
Max11.111

Max11.111

Bekanntes Mitglied
Dabei seit
12.06.2008
Beiträge
2.416
Reaktionspunkte
0
Hi,
ich habe gerade ein Programm geschrieben, welches einen Registry-Eintrag schreibt. Alles Ok!
Nun will ich aber den Eintrag auch wieder auslesen...
Code:
#include <windows.h>

int WINAPI WinMain(      
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow)
{
	HKEY hKey;


	//Open
	LONG lReturn = RegOpenKeyEx( HKEY_CURRENT_USER,
                             "Software\\Microsoft\\Windows\\Current Version\\Run",
                             NULL,
                             KEY_READ,
                             &hKey);

	if( lReturn == ERROR_SUCCESS )
	{
		LPDWORD type;
		LPBYTE data;
		LPDWORD size;

		//Read
		lReturn = RegQueryValueEx( hKey,
                               "shutdown",
                               NULL,
                               type,
                               data,
                               size);
                               
		if( lReturn == ERROR_SUCCESS )
		{
        [INDENT][INDENT][INDENT][INDENT]MessageBox(NULL, (LPCSTR)data, "", NULL);[/INDENT][/INDENT][/INDENT][/INDENT]
		}
	}
}
Beim Debuggen kommt folgender Fehler:
Das Programm "[2824] registry lesen.exe: Systemeigen" wurde mit Code 2 (0x2) beendet.
:wah::wah::wah:

Ich bedanke mich für eure Hilfe!
 
  • Problem mit RegQueryValueEx Beitrag #2
Max11.111

Max11.111

Bekanntes Mitglied
Dabei seit
12.06.2008
Beiträge
2.416
Reaktionspunkte
0
  • Ich besitze Lese- und Schreibrechte unter HKEY_CURRENT_USER (bin aber Eingeschränkter Benutzer).
  • Mittlerweile heißt es:
    Das Programm "[1708] registry lesen.exe: Systemeigen" wurde mit Code 0 (0x0) beendet.
  • 0x0 heißt doch eigentlich: Alles Ok, aber ich seh nix!
  • Es kommen jetzt drei Warnungen:
    \main.cpp(31) : warning C4700: Die nicht initialisierte lokale Variable "size" wurde verwendet.

    \main.cpp(31) : warning C4700: Die nicht initialisierte lokale Variable "data" wurde verwendet.

    \main.cpp(31) : warning C4700: Die nicht initialisierte lokale Variable "type" wurde verwendet.
  • Aber wie soll ich sie denn dann initialisieren??
    Code:
    LPDWORD type={""};
    LPBYTE data={""};
    LPDWORD size={""};
    gibts drei Errors, bei
    Code:
    LPDWORD type="";
    LPBYTE data="";
    LPDWORD size="";
    ebenfalls!
  • Habe jetzt auch noch
    Code:
    else
         MessageBox(NULL, "Error!", "", NULL);
    nach
    Code:
    if( lReturn == ERROR_SUCCESS )
    {
            MessageBox(NULL, (LPCSTR)data, "", NULL);
    }
    eingebaut, erfolglos:no:
 
  • Problem mit RegQueryValueEx Beitrag #3
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
  • 0x0 heißt doch eigentlich: Alles Ok, aber ich seh nix!
Nein. Der Rückgabewert ist derjenige, den DU mit "return" zurückgibst. Da Du aber keinen zurückgibst...
  • Es kommen jetzt drei Warnungen:
  • Aber wie soll ich sie denn dann initialisieren??
    Code:
    LPDWORD type={""};
    LPBYTE data={""};
    LPDWORD size={""};
    gibts drei Errors, bei
    Code:
    LPDWORD type="";
    LPBYTE data="";
    LPDWORD size="";
    ebenfalls!
Jup. Wenn Du Dir nochmal die Beschreibung von RegQueryVakueEx ansiehst, dann steht da nämlich, daß die letzten 3 Parameter als OUT deklariert sind. Die Funktion gibt was zurück und Du mußt den Speicherplatz dazu bereitstellen und übergibst der Funktion nur den Zeiger darauf. LP steht übrigens für "Long Pointer". LPDWORD ist also nichts anderes als ein Zeiger auf ein DWORD.
In der MSDN ist ein Codebeispiel dazu:
http://msdn.microsoft.com/en-us/library/ms724911(VS.85).aspx

Noch ein Tipp: Nutz den hervorragenden Debugger von Visual Studio! Damit kannst Du Dein Programm Zeile für Zeile durchgehen und Dir jederzeit den Inhalt der Variablen ansehen. So siehst Du gleich, an welcher Stelle was schiefläuft.
 
  • Problem mit RegQueryValueEx Beitrag #4
Max11.111

Max11.111

Bekanntes Mitglied
Dabei seit
12.06.2008
Beiträge
2.416
Reaktionspunkte
0
Jup. Wenn Du Dir nochmal die Beschreibung von RegQueryVakueEx ansiehst, dann steht da nämlich, daß die letzten 3 Parameter als OUT deklariert sind. Die Funktion gibt was zurück und Du mußt den Speicherplatz dazu bereitstellen und übergibst der Funktion nur den Zeiger darauf. LP steht übrigens für "Long Pointer". LPDWORD ist also nichts anderes als ein Zeiger auf ein DWORD.[...]
Also:
Code:
#include <windows.h>

int WINAPI WinMain(      
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow)
{
	HKEY hKey;


	//Open
	LONG lReturn = RegOpenKeyEx( HKEY_CURRENT_USER,
                             "Software\\Microsoft\\Windows\\Current Version\\Run",
                             NULL,
                             KEY_READ,
                             &hKey);

	if( lReturn == ERROR_SUCCESS )
	{
[B]		DWORD type=0;
		DWORD data= 8129;
		DWORD size=0[/B];

		//Read
		lReturn = RegQueryValueEx( hKey,
                               "shutdown",
                               NULL,
                               (LPDWORD)&type,
                               (LPBYTE)&data,
                               (LPDWORD)&size);
                               
		if( lReturn == ERROR_SUCCESS )
		{
                        MessageBox(NULL, (LPCSTR)data, "", NULL);
		        [B]return 0;[/B]
		}
		else
		{
			MessageBox(NULL, "Error!", "", NULL);
			[B]return 1;[/B]
		}
	}
}
Noch ein Tipp: Nutz den hervorragenden Debugger von Visual Studio! Damit kannst Du Dein Programm Zeile für Zeile durchgehen und Dir jederzeit den Inhalt der Variablen ansehen. So siehst Du gleich, an welcher Stelle was schiefläuft.
Einfach indem ich F5 drücke, oder?

Ach ja, es geht immer noch nicht...
 
  • Problem mit RegQueryValueEx Beitrag #5
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
Also:
Einfach indem ich F5 drücke, oder?
Fast, Du mußt vorher noch einen Breakpoint setzen. Einfach den Cursor in die Zeile stellen, wo das Programm stoppen soll, dann F9 drücken. Dann mit F5 starten und das Programm hält an. Dann kannst Du per Single-Step Zeile für Zeile weitergehen.

Zum Programm: Sieht schon besser aus. Aber LPBYTE ist ein Zeiger auf ein BYTE bzw. ein Byte-Array. Also: BYTE data[128]; Dort soll der String abgelegt werden. Damit Die Funktion weiß, wie groß der Datenpuffer ist, muß size so initialisiert werden: DWORD size = sizeof(data);
 
  • Problem mit RegQueryValueEx Beitrag #6
Max11.111

Max11.111

Bekanntes Mitglied
Dabei seit
12.06.2008
Beiträge
2.416
Reaktionspunkte
0
Hi, ich habe jetzt den Code angeändert wie Folgt:
Code:
#include <windows.h>

int WINAPI WinMain(      
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow)
{
	HKEY hKey;


	//Open
	LONG lReturn = RegOpenKeyEx( HKEY_CURRENT_USER,
                             "Software\\Microsoft\\Windows\\CurrentVersion\\Run",
                             NULL,
                             KEY_READ,
                             &hKey);

	if(lReturn == ERROR_SUCCESS )
	{
		DWORD type=0;
		BYTE data[128];
		DWORD size = sizeof(data);

		//Read
		lReturn = RegQueryValueEx( hKey,
                               "shutdown",
                               NULL,
                               (LPDWORD)type,
                               (LPBYTE)data,
                               (LPDWORD)size);
                               
		if(lReturn == ERROR_SUCCESS)
		{
        MessageBox(NULL, (LPCSTR)data, "", NULL);
		return 0;
		}
		else
		{
			MessageBox(NULL, "Error!\nCouldn't read Value!", "", NULL);
			return 1;
		}
	}
	else 
	{
		MessageBox(NULL, "Error!\nCouldn't open Key!", "", NULL);
		return 1;
	}
}
Jetzt setze ich den Cursor in die Letzte Zeile vor }.
F9 und dann kompilieren, dann F5.

Fehler & Warnungs freies Kompilieren.

Aber beim Debuggen kommt der Fehler:
Unbehandelte Ausnahme bei 0x77da7904 in registry lesen.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000080.

HILFE!
 
  • Problem mit RegQueryValueEx Beitrag #7
C

COGE

Bekanntes Mitglied
Dabei seit
13.01.1999
Beiträge
6.151
Reaktionspunkte
3
Ort
hinten wie von vorne
wenn du im Debugmodus zeile für Zeile durchgehst, wo fliegt er raus?
 
  • Problem mit RegQueryValueEx Beitrag #8
Max11.111

Max11.111

Bekanntes Mitglied
Dabei seit
12.06.2008
Beiträge
2.416
Reaktionspunkte
0
Hier:




Der Pfad existier und der Wert auch:

 
Zuletzt bearbeitet:
  • Problem mit RegQueryValueEx Beitrag #9
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
Der Cursor sollte eigentlich an der Zeile stehen, wo der Fehler aufgetreten ist.

Der Fehler dürfte aber dadurch zustandekommen, daß bei RegQueryValueEx die & fehlen, die vorher noch vorhanden waren.
Nochmal zum Verständnis:
DWORD size; reserviert Speicher auf dem Stack (4 Byte = 32 Bit). RegQueryValueEx braucht aber die Adresse, an der die Datenbytes der Variablen size abgelegt sind, damit es dort was reinschreiben kann. Die bekommst Du mit dem &-Operator raus. &size ist also die gesuchte Adresse. LPDWORD ist dasselbe wie DWORD*. Das casten alleine nutzt allerdings nichts, denn wenn Du das & vergißt, dann interpretiert RegQueryValueEx den Wert der Variablen, also in dem Fall 128 (= sizeof(data)), als Adresse und versucht seine Daten an Adresse 128 (=0x80) abzulegen, was natürlich schiefgeht. Deshalb auch der Fehler: Zugriffsverletzung beim Lesen an Position 0x00000080.
 
  • Problem mit RegQueryValueEx Beitrag #10
Max11.111

Max11.111

Bekanntes Mitglied
Dabei seit
12.06.2008
Beiträge
2.416
Reaktionspunkte
0
Der Cursor sollte eigentlich an der Zeile stehen, wo der Fehler aufgetreten ist.

Der Fehler dürfte aber dadurch zustandekommen, daß bei RegQueryValueEx die & fehlen, die vorher noch vorhanden waren.
Nochmal zum Verständnis:
DWORD size; reserviert Speicher auf dem Stack (4 Byte = 32 Bit). RegQueryValueEx braucht aber die Adresse, an der die Datenbytes der Variablen size abgelegt sind, damit es dort was reinschreiben kann. Die bekommst Du mit dem &-Operator raus. &size ist also die gesuchte Adresse. LPDWORD ist dasselbe wie DWORD*. Das casten alleine nutzt allerdings nichts, denn wenn Du das & vergißt, dann interpretiert RegQueryValueEx den Wert der Variablen, also in dem Fall 128 (= sizeof(data)), als Adresse und versucht seine Daten an Adresse 128 (=0x80) abzulegen, was natürlich schiefgeht. Deshalb auch der Fehler: Zugriffsverletzung beim Lesen an Position 0x00000080.
Oh, ja ich schau mal



//Edit:
Ja, es geht!


Endlich die langersehnte MessageBox;)

Wiedermal :)D), Danke UnimatrixZero & COGE !
 
Thema:

Problem mit RegQueryValueEx

ANGEBOTE & SPONSOREN

https://www.mofapower.de/

Statistik des Forums

Themen
213.179
Beiträge
1.579.172
Mitglieder
55.878
Neuestes Mitglied
Satan666
Oben