Seite 1 von 1

PB4 Windows - Unicode Executable & Registry

Verfasst: 19.12.2006 12:15
von funk.munich
Hi zusammen,

wenn ich ein "Unicode Executable" erstelle und in dem Code einen
Registry Wert erzeugen will:

Code: Alles auswählen

Procedure createRegKeyNameValue(mainKey.q, subKey.s, vName.s, vValue.s) 
  
  GetHandle = RegOpenKeyEx_(mainKey, subKey, 0, #KEY_ALL_ACCESS, @hKey) 
 
  lpcbData = 255 
  lpData.s = Space(255) 

  GetHandle = RegSetValueEx_(hkey, vName, 0, #REG_SZ, @vValue, Len(vValue) + 1) 
      
  RegCloseKey_(hkey) 
 
EndProcedure 

createRegKeyNameValue(#HKEY_LOCAL_MACHINE, "Software\Microsoft\Windows\CurrentVersion\Uninstall\TEST DF", "DisplayName", "Test Deutschland") 
wird danach in der Registry der Wert "Test Deutschland" nur abgeschnitten angezeigt "Test Deu". Und das wars.

Ohne Unicode funxt es einwandfrei.

Hatte das Problem schon jemand?

Warum Unicode? ... Ich will unterschiedlich Sprachdateien einlesen und
dort müssen ja die Sonderzeichen, etc. dann richtig angezeigt werden.
Oder gibt es hierzu eine andere Lösung?

Danke + Gruß,
Daniel

Verfasst: 19.12.2006 14:18
von Kaeru Gaman
der knackpunkt sitzt bei

Code: Alles auswählen

Len(vValue) + 1
Len() bibt die Länge des Strings in Zeichen zurück,
die Funktion erwartet die Länge des Buffers in Byte.

da in Unicode ein Zeichen zwei Byte braucht, übergibst du nur die hälfte.


wozu dient das +1 ?


es gibt SizeOf(Character)

du musst also mit der aktuellen char-größe multiplizieren.
aber ob das nun

Code: Alles auswählen

(Len(vValue) + 1) * SizeOf(Character)
sein muss,
oder

Code: Alles auswählen

Len(vValue) * SizeOf(Character) + 1
, kann ich dir erst sagen, wenn ich weiß wozu die +1 dient... ;)

Verfasst: 19.12.2006 15:09
von ts-soft
>> lpcbData = 255
Das kann man unter Win9x machen :mrgreen:
Buffer von 1 und die Funktion meldet Dir, das der Buffer nicht reicht. In
einem der Rückgabewerte findeste dann den erforderlichen Buffer.

Die Funktion muß also 2x aufgerufen werden. Das auswerten des
ErrorResults ist auch sehr wichtig!

Weiteres im PSDK, mußte gucken, habs unter Linux leider nicht installiert

Gruß
Thomas

// Nachtrag:
In der Registry (zumindest unter NT), werden Strings immer in UNICODE
gespeichert. Zum auslesen wird ein Puffer benötigt, der den gesamten
Unicode-String aufnehmen kann. Bei Aufruf der ANSI-Version der API wird
dieser Puffer anschließend mit einem ANSI-String gefüllt. Bei einem Puffer
von 255 passen also ca. 120 Zeichen hinein :wink:

Solltest Dir also den Source dieser Lib zur Hilfe nehmen:
http://www.purebasic.fr/german/viewtopic.php?t=10820