Kompatibilitätsmodus: Unicode aus Registry wird abgeschnitten
-
Hi!
Ich bin grade auf etwas Seltsames draufgekommen.
Zunächst einen Unicode-String als REG_SZ in die Registry schreiben (RegSetValueEx), zB L"ABC DEF GHI". Die Binärdaten sehen dann so aus:41 00 00 00 42 00 00 00
43 00 00 00 20 00 00 00
44 00 00 00 45 00 00 00
46 00 00 00 20 00 00 00
47 00 00 00 48 00 00 00
49 00 00 00 00 00 00 00Dann auslesen (RegQueryValueEx), ausgegeben wird wie erwartet "ABC DEF GHI" bei (outsize) lpcbData = 42.
Doch nun setzt man den Kompatibilitätsmodus der Anwendung, die ausliest/ausgibt. Egal welchen, von Windows 95 bis 7, immer die gleiche Ausgabe: "A" bei lpcbData = 2.
Dasselbe übrigens auch unter Windows XP, bei gesetztem Komp.Modus (Windows 95 bis 2000).
Windows Bug?
-
Deine Binärdaten, die Du schreibst sind falsch.
41 00 42 00 43 00 20 00 ...Wäre korrekt.
Was soll da nicht funktionieren?Die Ausgabe A alleine ist vollkommen richtig.
-
Windows verwendet als Unicode UTF-16 und nicht UTF-32....
-
Ok, eigentlich geht es um eine ältere Engine. Dann ist das wohl ein Bug darin.
Hab mich eh schon gewundert, warum 4 Byte, aber ohne Kompat.Modus funktioniert es ja, deshalb dachte ich, es sei OK so.Warum schreibt RegSetValueExA eigentlich 4 Byte pro wchar_t?
wchar_t name[] = L"ABC DEF GHI";
RegSetValueExA(hKey, "Name", 0, REG_SZ, (BYTE*)name, (wcslen(name) + 1) * 2); // 24
-
Shit in Shit out... sage ich das nur.
RegSetValueExA Will als Daten MBCS Code haben. Du lieferst aber einen Unicode Stirng. Also wird Dein Unicode String wieder in MBCS gewandelt.
Das ist so ein Unfug... Werde Dir mal klar was die A/W Funktionen bedeuten. Eine A Funktion will "niemals" einen Unicodestring. Wenn, musst Du hier W nehmen!