RegQueryValueEx liefert keinen/falschen Wert

Baron Sengir

Mitglied
Hi,

ich greife auf WindowsRegistry mit folgendem Code zu:


C++:
	// Registry - Geschichten

	unsigned char temp[99] = {""};
	unsigned long size = sizeof(temp);
	HKEY hKey;
	CString tmp;
	LPTSTR t;
	long error;

	int player1, player2;
	CString HOST, USER, PASS;
	
	t = NULL;
	error = RegOpenKey(HKEY_CURRENT_USER, "Software\\TDJv3\\Player1", &hKey);
	if (error == 0)
	{ // Key für Player 1 existiert
		RegQueryValueEx(hKey, "", NULL, NULL, temp, &size);
		RegCloseKey(hKey);
		tmp.Format("%s", temp);
		player1 = StrToInt(tmp);
	} else
	{ // Key für Player 1 existiert nicht
        RegCreateKey(HKEY_CURRENT_USER, "Software\\TDJv3", &hKey);
		RegSetValue(hKey, "Player1", REG_SZ, "0", 0);
		RegCloseKey(hKey);
	}
	error = RegOpenKey(HKEY_CURRENT_USER, "Software\\TDJv3\\Player2", &hKey);
	if (error == 0)
	{ // Key für Player 2 existiert
		RegQueryValueEx(hKey, "", NULL, NULL, temp, &size);
		RegCloseKey(hKey);
		tmp.Format("%s", temp);
		player2 = StrToInt(tmp);
	} else
	{ // Key für Player 2 existiert nicht
        RegCreateKey(HKEY_CURRENT_USER, "Software\\TDJv3", &hKey);
		RegSetValue(hKey, "Player2", REG_SZ, "0", 0);
		RegCloseKey(hKey);
	}
	error = RegOpenKey(HKEY_CURRENT_USER, "Software\\TDJv3\\HOST", &hKey);
	if (error == 0)
	{ // Key für HOST existiert
		RegQueryValueEx(hKey, "", NULL, NULL, temp, &size);
		HOST.Format("%s", temp);
		RegCloseKey(hKey);
	} else
	{ // Key für HOST existiert nicht
        RegCreateKey(HKEY_CURRENT_USER, "Software\\TDJv3", &hKey);
		RegSetValue(hKey, "HOST", REG_SZ, "localhost", 0);
		RegCloseKey(hKey);
	}
		error = RegOpenKey(HKEY_CURRENT_USER, "Software\\TDJv3\\USER", &hKey);
	if (error == 0)
	{ // Key für USER existiert
		RegQueryValueEx(hKey, "", NULL, NULL, temp, &size);
		USER.Format("%s", temp);
		RegCloseKey(hKey);
	} else
	{ // Key für USER existiert nicht
        RegCreateKey(HKEY_CURRENT_USER, "Software\\TDJv3", &hKey);
		RegSetValue(hKey, "USER", REG_SZ, "root", 0);
		RegCloseKey(hKey);
	}
	error = RegOpenKey(HKEY_CURRENT_USER, "Software\\TDJv3\\PASS", &hKey);
	if (error == 0)
	{ // Key für PASS existiert
		RegQueryValueEx(hKey, "", NULL, NULL, temp, &size);
		PASS.Format("%s", temp);
		RegCloseKey(hKey);
	} else
	{ // Key für PASS existiert nicht
        RegCreateKey(HKEY_CURRENT_USER, "Software\\TDJv3", &hKey);
		RegSetValue(hKey, "PASS", REG_SZ, "", 0);
		RegCloseKey(hKey);
	}

Bei allerersten Durchlaufen des Programms funktioniert auch alles wunderbar. In die Registry werden die richtigen Werte gesetzt.

Beim zweiten Durchlaufen des Programms, liefern aller Variablen den richtigen Inhalt der Registry zurück bis auf HOST. HOST liefert 0. 0 ist aber der Wert von Player 2, der zuvor ausgelesen wird.

Was mache ich falsch?

In der Hoffnung auf Hilfe,

Markus
 
Zuletzt bearbeitet:
Hi.

Baron Sengir hat gesagt.:
Code:
RegQueryValueEx(hKey, "", NULL, NULL, temp, &size);
Erstmal besitzt die Funktion auch einen Rückgabewert der ERROR_SUCCESS ist wenn kein Fehler aufgetreten ist, anderenfalls einen Fehlercode enthält den man abfragen kann und sich z.B. mit der FormatMessage Funktion ausgeben lassen kann. (ist in deinem Fall höchstwahrscheinlich ERROR_MORE_DATA)

Dann ist der Parameter size ein Eingabe- und Ausgabeparamter - das heißt die Funktion verändert den Wert der Variablen (daher muß man ja auch einen Pointer übergeben).

Das heißt du mußt diese Variable bevor du die Funktion RegQueryValueEx aufrufst neu initialisieren, denn da steht ja noch vom vorherigen Aufruf eine 1 drin wenn der Wert in der Registry nur "0" war.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/regqueryvalueex.asp hat gesagt.:
Ensure that you reinitialize the value pointed to by the lpcbData parameter each time you call this function. This is very important when you call this function in a loop...
Gruß
 
Zurück