RegQueryValueEx in einen string schreiben.

Airic

Grünschnabel
Hallo Gemeinde,

ich versuche schon seit Tagen verzweifelt einen Wert aus der Registry zu lesen und komplett auszugeben. Ich habe folgenden Code mit Visual C++ 2008 erstellt:

Code:
#include <iostream>
#include <windows.h>

using namespace ::std;


int main (int argc, char *argv[])
{
	HKEY hKey;
	BYTE value[99] = {0};
	DWORD lengh = sizeof(value);

	RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Software\\7-Zip"), 0, KEY_QUERY_VALUE, &hKey);
	RegQueryValueEx(hKey, TEXT("Path"), NULL, NULL, value, &lengh);

	cout << value << endl;

	RegCloseKey(hKey);
	getchar();
};


value ist der Puffer, in den er den Registrywert schreibt. Er liest den Wert auch komplett aus, gibt mir auf dem Bildschirm allerdings nur das erste Zeichen des Wertes aus. Wenn ich cout << value mit z.B. cout << value[4] ersetze, gibt er mir das 3. Zeichen des Wertes aus. Mit einer while-Schleife kann ich das mit der Ausgabe über Umwege natürlich hinbekommen, aber ich möchte den Wert auch mit einem anderen vergleichen. Wie kann ich den Puffer value jetzt in einen String schreiben um ihn komplett auszugeben oder auch vergleichen zu können?


Vielen Dank schon mal für Eure Bemühungen :)

VG Eric
 
RegQueryValueEx liefert keinen ANSI-String zurück, sondern arbeitet mit Unicode, also wchar
Nicht zwangsläufig; das hängt von den Projekteinstellungen ab. Die stehen allerdings defaultmäßig auf Unicode :)
Man könnte die ANSI-Version explizit mit RegQueryValueExA aufrufen. Grundsätzlich halte ich es aber für sinnvoller, mit Unicode zu arbeiten, um damit für alle Eventualitäten (Sonderzeichen) gerüstet zu sein.

Gruß
MCoder
 
Nicht zwangsläufig; das hängt von den Projekteinstellungen ab. Die stehen allerdings defaultmäßig auf Unicode :)
Man könnte die ANSI-Version explizit mit RegQueryValueExA aufrufen. Grundsätzlich halte ich es aber für sinnvoller, mit Unicode zu arbeiten, um damit für alle Eventualitäten (Sonderzeichen) gerüstet zu sein.

Gruß
MCoder

Eigentlich doch, denn die zu verwendende DLL lässt sich von irgendwelchen Projekteinstellungen nicht beeindrucken. Es ist wohl vielmehr so, dass Aufrufe von RegQueryEx vom Compiler durch Aufrufe von RegQueryExA ersetzt werden, wenn die Projekteinstellungen auf ANSI stehen. Ein Blick in die zuständige Header-Datei könnte das verifizieren.
 
Da hätte ich aber auch selbst drauf kommen können :-( Wenn ich mit RegSet in die Registry schreibe, verwende ich ja auch explizit die ANSI-Version.

Wie schon richtig vermutet ist das Projekt auf Unicode eingestellt. Wenn ich jetzt explizit die ANSI-Version mit RegQueryValueExA aufrufe, funktioniert es wie gewünscht.

Vielen Dank für die schnelle Hilfe :D
 
Falls noch andere auf das Problem stoßen, möchte ich hier mal den kompletten Quelltext bereitstellen um einen Registryeintrag auszulesen und zu überprüfen:

Code:
#include <iostream>
#include <windows.h>

using namespace ::std;

int main (int argc, char *argv[])
{
	HKEY hKey;
	char value[1024] = {0};
	DWORD lengh = sizeof(value);

	if (RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Software\\7-Zip"), 0, KEY_QUERY_VALUE, &hKey) != ERROR_SUCCESS)
	{
		cout << "Schlüssel kann nicht geöffnet werden!" << endl;
	}
	else
	{
		RegQueryValueExA(hKey, "Path", NULL, NULL, LPBYTE(value), &lengh);
		RegCloseKey(hKey);

		if (strcmp(value, "C:\\Program Files\\7-Zip\\") != 0)
		{
			cout << "Eintrag falsch oder nicht vorhanden!" << endl;
		}
		else
		{
			cout << "Eintrag korrekt! Länge: " << lengh - 1 << " Zeichen!" << endl;
		}
	}

	getchar();
};

VG Eric
 
Zurück