Moduły » System

StringToWideChar

StringToWideChar
Moduł: System

function StringToWideChar(const Source: string; Dest: PWideChar; DestSize: Integer): PWideChar;

Funkcja konwertuje łańcuch typu String (parametr Source) do postaci łańcucha typu Unicod - 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 komentarze

Juhas 2010-01-15 17:24

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;

pootek 2008-09-14 01:44

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.