RegSetValue() Problem mit dem Zeichensatz
-
Dein Projekt verwendet Unicode.
Key und Value hast Du mit Hilfe vonTEXT()als Unicode (16 Bit) an die FunktionenRegOpenKey()undRegSetValueEx()weitergereicht. Die Daten ("Mr.Reese") gibst Du aber alschar(8 Bit) anRegSetValueEx(). Die acht Zeichen "Mr.Reese" werden dann als vier Unicodezeichen interpretiert, die sich zufällig gerade gerade im chinesische bewegen ("Mr" == 0x724d == 牍).
-
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 andererseitsRegSetValueExA/RegSetValueExW.
-
Darum verwendet man *niemals* die Makro-abhaengigen Funktionen.
-
Caligulaminus schrieb:
Dein Projekt verwendet Unicode.
Key und Value hast Du mit Hilfe vonTEXT()als Unicode (16 Bit) an die FunktionenRegOpenKey()undRegSetValueEx()weitergereicht. Die Daten ("Mr.Reese") gibst Du aber alschar(8 Bit) anRegSetValueEx(). 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
usernameso:char username[] = "Mr.Reese"; // Länge wird automatisch erkannt - hier sollte sie 9 seinDann ist die Längenangabe nur noch
sizeof(username)(inklusive Nullterminierung).Und außerdem brauchst du gar nicht nach
LPBYTEcasten - die Funktion erwartetBYTE const*(welches laut Doku effektivunsigned 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
-
... 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
-
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
-
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.