PB4 Windows - Unicode Executable & Registry

Anfängerfragen zum Programmieren mit PureBasic.
funk.munich
Beiträge: 123
Registriert: 27.03.2006 09:45

PB4 Windows - Unicode Executable & Registry

Beitrag 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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... ;)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten