ERLEDIGT
JA
JA
ANTWORTEN
6
6
ZUGRIFFE
684
684
EMPFEHLEN
-
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 :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
#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. Deswegen ist jedes zweite Byte in deinem BYTE-Array 0, was als Stringende angesehen wird. Du musst wchar_t als Datentyp verwenden, dann kannst du dein Array als Parameter eines String-Konstruktors verwenden. Bei MSDN gibt es die Doku für String-Konstruktor (Char[]) und ein Beispiel zum Auslesen der Registry.
Vielen Dank für die Nutzung des Bewerten- und Danke-Buttons
Wenn man sieht, dass man einen anderen glücklich gemacht hat, ist die Welt um zwei glückliche Menschen reicher.
-
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"The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
--- Larry Wall
-
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.
Vielen Dank für die Nutzung des Bewerten- und Danke-Buttons
Wenn man sieht, dass man einen anderen glücklich gemacht hat, ist die Welt um zwei glückliche Menschen reicher.
-
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
-
"The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
--- Larry Wall
-
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 :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
#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
Ähnliche Themen
-
[C#] Nur Zahlen und Buchstaben in einen String schreiben
Von Klasse Typ im Forum .NET CaféAntworten: 3Letzter Beitrag: 31.08.10, 21:14 -
In einen variablen String einen anderen an bestimmter Stelle einfügen
Von firewing im Forum PHPAntworten: 2Letzter Beitrag: 30.09.09, 23:10 -
String in einen OutputStream schreiben - welche Klassen verwenden?
Von DarthShader im Forum JavaAntworten: 6Letzter Beitrag: 17.07.08, 09:34 -
C#, XML komfortabel in einen String schreiben
Von SpAder im Forum .NET DatenverwaltungAntworten: 3Letzter Beitrag: 30.09.06, 10:57 -
Wie wandel ich einen Binary-String in einen Hex-String ?
Von ObScUrItAs im Forum C/C++Antworten: 4Letzter Beitrag: 05.05.05, 20:47





Zitieren

Login






