RegSetValue() Problem mit dem Zeichensatz



  • Dein Projekt verwendet Unicode.
    Key und Value hast Du mit Hilfe von TEXT() als Unicode (16 Bit) an die Funktionen RegOpenKey() und RegSetValueEx() weitergereicht. Die Daten ( "Mr.Reese" ) gibst Du aber als char (8 Bit) an RegSetValueEx() . Die acht Zeichen "Mr.Reese" werden dann als vier Unicodezeichen interpretiert, die sich zufällig gerade gerade im chinesische bewegen ("Mr" == 0x724d == 牍).


  • Mod

    Dein Projekt verwendet Unicode.

    Habe ich auch direkt vermutet, die Doku sagt jedoch

    REG_SZ: [...] This will be either a Unicode or an ANSI string, depending on whether you use the Unicode or ANSI functions.

    Und von welchen Funktionen ist hier die Rede?

    Edit: Ach, es ist einerseits dieselbe Funktion, nur mit verschiedenen Versionen - abhängig vom UNICODE -Makro. Und andererseits RegSetValueExA / RegSetValueExW .



  • Darum verwendet man *niemals* die Makro-abhaengigen Funktionen.



  • Caligulaminus schrieb:

    Dein Projekt verwendet Unicode.
    Key und Value hast Du mit Hilfe von TEXT() als Unicode (16 Bit) an die Funktionen RegOpenKey() und RegSetValueEx() weitergereicht. Die Daten ( "Mr.Reese" ) gibst Du aber als char (8 Bit) an RegSetValueEx() . Die acht Zeichen "Mr.Reese" werden dann als vier Unicodezeichen interpretiert, die sich zufällig gerade gerade im chinesische bewegen ("Mr" == 0x724d == 牍).

    Gut, das klingt soweit aus theoretischer Sich einleuchtend.

    Arcoth schrieb:

    Die Längenangabe ( strlen(username)*sizeof(char) ) ist schon mal definitiv falsch.

    Deklariere doch einfach mal username so:

    char username[] = "Mr.Reese"; // Länge wird automatisch erkannt - hier sollte sie 9 sein
    

    Dann ist die Längenangabe nur noch sizeof(username) (inklusive Nullterminierung).

    Und außerdem brauchst du gar nicht nach LPBYTE casten - die Funktion erwartet BYTE const* (welches laut Doku effektiv unsigned char const* entspricht).

    Habe das soweit mal angepasst, allerdings kommt es immer noch auf's Selbe hinaus.

    Der aktuelle Code sieht nun, wie folgt aus:

    HKEY key;
    	char username[] = "Mr.Reese";
    	if (RegOpenKey(HKEY_CURRENT_USER, TEXT("Software\\SAMP"), &key) != ERROR_SUCCESS){
    		this->label1->Text = "Error";
    		RegCloseKey(key);
    	}
    
    	if (RegSetValueEx(key, TEXT("PlayerName"), 0, REG_SZ, (unsigned char*)username, sizeof(username)) != ERROR_SUCCESS){
    	   this->label1->Text = "Error2";
    	   RegCloseKey(key);
    	}else{
    	   this->label1->Text = "Success";
    	}
    

    Wo liegt noch der Hund begraben?

    Danke schonmal.

    Grüße


  • Mod

    ... Du verwendest nach wie vor Unicode?

    Nimm mal statt RegSetValueEx RegSetValueExA, und schau ob es immer noch nicht klappt.



  • Jap, das war der Fehler.
    Danke für alle Antworten.

    Eine kleine Frage allerdings noch: Wofür steht der Stern bei beispielsweise

    (unsigned char*)username
    

    ?
    Habe schon herausgefunden, dass es etwas mit Zeigern zu tun hat, allerdings ist mir der Sinn noch nicht so ganz schlüssig.

    Grüße


  • Mod

    Wofür steht der Stern bei beispielsweise [...]

    Der macht aus einem Typen A einen Zeiger auf den Typen A. Zeiger solltest du doch kennen?



  • Danke.

    Naja, nur aus dem Theoretischen, habe mit dem Problem hier im Thread angefangen.

    Hatte bisher auch bei anderen Programmiersprachen, wie PHP (wobei das ganz streng genommen eine Scriptsprache ist), etc. immer die Erfahrung, dass man beim Learning by doing am Besten lernt und das wollte ich bei c++ ebenso so halten.
    Daher habe ich einfach mal reingestartet und mit Zeigern praktisch noch nie zu tun gehabt.

    Grüße


  • Mod

    dass man beim Learning by doing am Besten lernt und das wollte ich bei c++ ebenso so halten.

    C++ ist dafür leider gar nicht geeignet.

    Für Grundlagen brauchst du ein gutes Buch, das ist heutzutage praktisch unentbehrlich. In der Linkliste für Neulinge findest du unter der ersten Rubrik Bücher.



  • Mr.Reese schrieb:

    Danke.

    Naja, nur aus dem Theoretischen, habe mit dem Problem hier im Thread angefangen.

    Hatte bisher auch bei anderen Programmiersprachen, wie PHP (wobei das ganz streng genommen eine Scriptsprache ist), etc. immer die Erfahrung, dass man beim Learning by doing am Besten lernt und das wollte ich bei c++ ebenso so halten.
    Daher habe ich einfach mal reingestartet und mit Zeigern praktisch noch nie zu tun gehabt.

    Grüße

    Ich denke das ist ein Irrtum. Wie viele Lernverfahren hast Du ausprobiert und wie hast Du sie miteinander verglichen? Wie hast Du beurteilt, ob Du das gelernte wirklich gelernt hast?

    So ein reines "lerning by doing" bedeutet in der Regel ein probieren bis es geht und erzeugt fürchterliche Ergebnisse. Besser ist es, aus einem guten Buch die Grundlagen zu lernen und dann in der Praxis auszuprobieren.

    Grundlagen zu lernen ist zwar lästig aber ohne wirst Du nie wirklich durch blicken. Und mit der Zeit macht es mehr Spaß, wenn man wirklich versteht, was ab geht. Das gilt in besonderen Maß für C++. Da geht mit durchprobieren wirklich sehr wenig und ist mit der Zeit wirklich frustierend.


Anmelden zum Antworten