StringToWideChar
Adam Boduch
StringToWideChar
Moduł: System
var
P : PWideChar;
S : String;
begin
S := 'Hello World';
New(P);
StringToWideChar(S, P, Length(S) + 1);
Writeln(P);
Dispose(P);
end.
Zobacz też:
var
P : PWideChar;
S : String;
begin
S := 'Hello World';
New(P);
StringToWideChar(S, P, Length(S) + 1);
Writeln(P);
Dispose(P);
end.
Zobacz też:
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.