AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Unicode-Umwandlung

Ein Thema von blackdrake · begonnen am 9. Aug 2007 · letzter Beitrag vom 12. Aug 2007
 
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#7

Re: Unicode-Umwandlung

  Alt 11. Aug 2007, 09:41
Zitat von blackdrake:
Delphi-Quellcode:
Function testfunktion(MBString : String) : pWideChar;
var
  WcBuffer : Array[0..MAX_PATH] of WideChar;
begin
     ...
     // Auf ... zugewiesener Wert wird niemals benutzt
     Result := WCBuffer; // Result := @WCBuffer[1];
     ....
end;
Das ist schonmal eine gaaanz schlechte Idee. Du gibst den Zeiger auf einen bestimmten Speicherbereich zurück, dieser soll hier natürlich auf ein Array von WideChars zeigen. Ein solcher Zeiger ist eben nur ein Registerwort (4 Byte) groß und enthält nur die Adresse des Datums, auf das Du zeigst. Da es sich bei der Variable WcBuffer um eine lokale Variable statischer Größe handelt, wird Delphi diese Variable für Dich auf dem Stack anlegen und von dort auch entfernen, sobald der entsprechende Scope (hier die Funktion) verlassen wird.
Anders gesagt zeigst Du im Ergebnis der Funktion auf einen Speicherbereich, der gar nicht mehr gültig ist. Hier solltest Du lieber auf ein dyn. Array setzen, diese werden auf dem Heap-erzeugt, die Adresse bleibt damit global gültig. Nach der Benutzung solltest Du dann aber auch mit finalize(<dynArray>) und setLength(<dynArray>, 0) das Array explizit frei geben (schont Ressourcen). Bei der Verwendung ist dann darauf zu achten, dass Du nicht direkt die Variable übergibst, sondern dass erste Element (<dynArray>[0]).

Was den Aufruf von MultiByteToWideChar angeht, so solltest Du hier schauen, was als Ergebnis der Umwandlung zurückkommt, alle Werte ungleich 0 zeigen einen Fehler an. Zudem könnte die Konvertierung des übergebenen Strings in ein PChar etwas problematisch sein. So endet ein PChar mit einem Null-Character (#$00), dass bei Dir bereits das erste Zeichen ist. Damit dürftest Du einen leeren String umwandeln wollen, was natürlich nicht so richtig gut klappt. Du solltest also mal schauen, was überhaupt in Dein doch recht leeren String erhalten, da solltest Du dann schauen, was eigentlich in WCBuffer steht bzw. auch schon, welchen Wert Size hat.

Gruß Der Unwissende
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:20 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz