[C++/win]DWORD-Wert aus Registry auslesen

da real shit

Lt. Junior Grade
Registriert
Mai 2005
Beiträge
277
Hallo,
Ich möchte, dass mein Programm nur beim ersten start eine Messagebox ausgibt, dazu soll sie in die Registry einen schlüssel anlegen und einen Dword Wert schreiben, beim starten wird dann über prüft wie der Wert ist und je nach dem die Messagbox ausgegeben oder eben nicht. Allerdings funktioniert es leider noch nicht so wie ich möchte:

Code:
HKEY MSG;

    DWORD dwNumber;   //WennDWORD dwNumber=0; dann immer aber wenn nur DWORD dwNumber; dann nie?
    DWORD dwData = sizeof(DWORD);
    RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Software\\Simpleedit",0,KEY_SET_VALUE,&MSG);
    RegQueryValueEx(MSG,"MSGBOX",0,0,(BYTE*)&dwNumber,&dwData);
    RegCloseKey(MSG);
    if(dwNumber==0)
    {
        MessageBox(NULL,"SimpleEdit V 0.1.0","Messagebox",MB_OK);    //die Messagebox
        dwNumber=1;
        RegCreateKeyEx(HKEY_LOCAL_MACHINE,"Software\\Simpleedit",0,0,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&MSG,0);
        RegSetValueEx(MSG,"MSGBOX",0,REG_DWORD,(BYTE*)&dwNumber,sizeof(DWORD));
        RegCloseKey(MSG);
    }
Was mich ausserdem Verwundert, ist dass ich als ich ein Console Program geschrieben habe welches mir den Wert ausgeben sollte eine 3407922 ausgab obwohl der Wert 1 war(Ich hab mit regedit nachgeschaut).

Grüße
drs
 
Zuletzt bearbeitet:
Es funktioniert nicht so wie du möchtest. Und das heißt?
Kommt eine Fehlermeldung oder funktioniert es garnicht?
 
Also eine Fehlermeldung kommt nicht. Er zeigt die Messagebox immer, wenn Zeile 2 so lautet: DWORD dwNumber=0; das will ich ja aber nicht, wenn die Zeile jedoch so aussieht: DWORD dwNumber; zeigt er die Messagebox nie.

Als IDE verwende ich code::blocks mit mingw32(also gcc), habe es jedoch auch schon mit Visual C++ 2005 Express kompiliert mit dem selben Ergebnis.

Der Fehler muss irgendwo beim auslesen sein, da der Wert ja korrekt in die Registry geschrieben wird.
 
Dann laß dir den Wert doch mal ausgeben.
Verändert er sich beim zweiten Aufruf oder nicht.
 
Nein er verändert sich nicht, konstant 3407922.
 
ich habe von ms-api nicht wirklich ahnung, aber sollte das:
(BYTE*)&dwNumber,&dwData
nicht eher so aussehen:
(DWORD*)&dwNumber,&dwData
das gleiche gild für
(BYTE*)&dwNumber,sizeof(DWORD)
die umwandlung sähe so aus:
(DWORD*)&dwNumber,sizeof(DWORD)
 
Funktioniert leider nicht, der Source ist folgender(als Console App):

Code:
#include <iostream>
#include <windows.h>
int main()
{
    HKEY MSG;

    DWORD dwNumber;
    DWORD dwData = sizeof(DWORD);
    RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Software\\Simpleedit",0,KEY_SET_VALUE,&MSG);
    RegQueryValueEx(MSG,"MSGBOX",0,0,(DWORD*)&dwNumber,&dwData);
    RegCloseKey(MSG);
    if(dwNumber==0)
    {
        MessageBox(NULL,"SimpleEdit V 0.1.0","Messagebox",MB_OK);    //die Messagebox
        dwNumber=1;
        RegCreateKeyEx(HKEY_LOCAL_MACHINE,"Software\\Simpleedit",0,0,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&MSG,0);
        RegSetValueEx(MSG,"MSGBOX",0,REG_DWORD,(DWORD*)&dwNumber,sizeof(DWORD));
        RegCloseKey(MSG);
    }
    std::cout << "Wert(sollte 1 sein): " << std::endl;
    std::cout << dwNumber<< std::endl;
    std::cin.get();
    return 0;
}

Allerdings will code::blocks nicht kompilieren:
Code:
 main.cpp:10: error: cannot convert `DWORD*' to `BYTE*' for argument `5' to `LONG RegQueryValueExA(HKEY__*, const CHAR*, DWORD*, DWORD*, BYTE*, DWORD*)'
main.cpp:17: error: cannot convert `DWORD*' to `const BYTE*' for argument `5' to `LONG RegSetValueExA(HKEY__*, const CHAR*, DWORD, DWORD, const BYTE*, DWORD)'
 
wenn die funktion nur bytes auslesen kann, dann solltest du vllt auch bytes haben wollen, oder?
dafür musst du den typ von dwNumber von dword auf byte wechseln. btw. unterlasse bitte die ungarische notation. sogar ms hat erkannt, dass das eine sackgasse war.

das erklärt dann auch, warum du die falschen daten bekommst. intel-systeme kodieren im little-endian verfahren. das heißt, die beiden bytes kommen für eine word in der falschen reinfolge.

hinweis: alle angaben ohne gewähr. mit windows kenne ich mich nicht aus.
 
Zuletzt bearbeitet:
Versuch's mal so:

PHP:
#include <iostream>
#include <windows.h>
int main()
{
	HKEY MSG;

	DWORD dwNumber = 0;
	DWORD dwData = sizeof(DWORD);

	if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Software\\Simpleedit",0,KEY_QUERY_VALUE,&MSG))
	{
		RegQueryValueEx(MSG,"MSGBOX",0,NULL,(BYTE*)&dwNumber,&dwData);
		RegCloseKey(MSG);
	}
	if(dwNumber==0)
	{
		MessageBox(NULL,"SimpleEdit V 0.1.0","Messagebox",MB_OK);    //die Messagebox
		dwNumber=1;
		RegCreateKeyEx(HKEY_LOCAL_MACHINE,"Software\\Simpleedit",0,0,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&MSG,0);
		RegSetValueEx(MSG,"MSGBOX",0,REG_DWORD,(BYTE*)&dwNumber,sizeof(DWORD));
		RegCloseKey(MSG);
	}
	std::cout << "Wert(sollte 1 sein): " << std::endl;
	std::cout << dwNumber<< std::endl;
	std::cin.get();
	return 0;
}
 
Vielen Dank Raechaer, mit deinem Source hat es Funktioniert.

@ghorst Was ist die ungarische Notation?
 
Achso, vielen Dank, war irgendwie zu blöd das bei Wikipedia zu finden.
 

Ähnliche Themen

Zurück
Oben