Thema: Delphi Unicode-Umwandlung

Einzelnen Beitrag anzeigen

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