StringToWideChar

Adam Boduch
StringToWideChar
Moduł: System
```delphi function StringToWideChar(const Source: string; Dest: PWideChar; DestSize: Integer): PWideChar; ``` [[Delphi/Funkcje|Funkcja]] konwertuje łańcuch typu [[Delphi/String]] (parametr Source) do postaci łańcucha typu Unicod - [[Delphi/PWideChar]]. Ilość znaków do skopiowania określona jest w parametrze DestSize natomiast Dest to bufor do którego zostaną zapisane dane. Funkcja zwraca wskaźnik do bufora Dest:
var
  P : PWideChar;
  S : String;
begin
  S := 'Hello World';
  New(P);
  StringToWideChar(S, P, Length(S) + 1);

  Writeln(P);
  Dispose(P);
end.

Zobacz też:

2 komentarzy

Zgadza się, w przykładzie jest błąd. Ponadto ten kod powoduje problemy z pamięcią. Jako ciekawostkę powiem, że z jakiegoś powodu w kodach Delphi przed tą funkcją jest napisane:
"Wide character support procedures and functions for C++
These functions should not be used in Delphi code!
(conversion is implicit in Delphi code)"

Nie wiem, co mieli na celu pisząc to ostrzeżenie.
W każdym razie grzebiąc w necie znalazłem poprawny kod, który wygląda tak:

var
s: string;
p: PWideChar;
begin
GetMem(p, sizeof(WideChar) * Succ(Length(s)));
StringToWideChar(s, p, Succ(Length(s)));
//tutaj zmienna p zawiera już ciąg ze stringa, na końcu oczywiście trza ją zwolnić
FreeMem(lName);
end;

Mam dziwne wrażenie, że w przykładzie jest błąd: PWideChar to wskaźnik na jeden znak WideChar, zatem New(P) zaalokuje miejsce dla tylko jednego znaku. StringToWideChar będzie natomiast próbował skopiować w to miejsce Length(S)+1 znaków, czyli raczej segmentation fault, albo niezauważone nadpisanie.