tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
6
ZUGRIFFE
684
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Airic Airic ist offline Grünschnabel
    Registriert seit
    Mar 2010
    Beiträge
    3
    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
     

  2. #2
    Avatar von Vereth
    Vereth Vereth ist offline Mitglied Brokat
    Registriert seit
    Nov 2009
    Ort
    Dortmund
    Beiträge
    372
    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.

  3. #3
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Zitat Zitat von Vereth Beitrag anzeigen
    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
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  4. #4
    Avatar von Vereth
    Vereth Vereth ist offline Mitglied Brokat
    Registriert seit
    Nov 2009
    Ort
    Dortmund
    Beiträge
    372
    Zitat Zitat von MCoder Beitrag anzeigen
    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.
     
    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.

  5. #5
    Airic Airic ist offline Grünschnabel
    Registriert seit
    Mar 2010
    Beiträge
    3
    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
     

  6. #6
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Zitat Zitat von Vereth Beitrag anzeigen
    Es ist wohl vielmehr so, dass Aufrufe von RegQueryEx vom Compiler durch Aufrufe von RegQueryExA ersetzt werden, wenn die Projekteinstellungen auf ANSI stehen
    Das ist die natürlich die richtige Erklärung. Bei Unicode wird der Aufruf dann entsprechend durch RegQueryValueExW ersetzt.

    Gruß
    MCoder
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  7. #7
    Airic Airic ist offline Grünschnabel
    Registriert seit
    Mar 2010
    Beiträge
    3
    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

  1. Antworten: 3
    Letzter Beitrag: 31.08.10, 21:14
  2. Antworten: 2
    Letzter Beitrag: 30.09.09, 23:10
  3. Antworten: 6
    Letzter Beitrag: 17.07.08, 09:34
  4. C#, XML komfortabel in einen String schreiben
    Von SpAder im Forum .NET Datenverwaltung
    Antworten: 3
    Letzter Beitrag: 30.09.06, 10:57
  5. Antworten: 4
    Letzter Beitrag: 05.05.05, 20:47