Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi String to PWideChar, wie wird es gemacht ? (https://www.delphipraxis.net/144333-string-pwidechar-wie-wird-es-gemacht.html)

turboPASCAL 5. Dez 2009 15:02


String to PWideChar, wie wird es gemacht ?
 
Zitat:

Zitat von turboPASCAL
Hi,

ich habe ein kleines Problem mit der Umwandlung eines (Delphi6-Ansi)Strings in einen PWideChar-Typen.


Delphi-Quellcode:
function StringToPWideChar(const s: AnsiString): PWideChar;
var
  len: integer;
begin
  //Result := StringToOleStr(s); {StringToOleStr & SysFreeString haben ein Memleakproblem }

  len := MultiByteToWideChar(CP_ACP, 0, PAnsiChar(s), -1, nil, 0);
  GetMem(Result, Len+1);
  MultiByteToWideChar(CP_ACP, 0, PAnsiChar(s), -1, Result, Len);
end;

function FreePWChar(ws: PWideChar): Bool;
begin
  //SysFreeString(ws);

  if ws <> nil then FreeMem(ws);
end;


//Edit:
So klappts:

Delphi-Quellcode:
function StringToPWideChar(const s: AnsiString): PWideChar;
var
  len: integer;
begin
  //Result := StringToOleStr(s);

  if s <> '' then
  begin
    len := length(s);
    GetMem(Result, Len * 2);
    MultiByteToWideChar(CP_ACP, 0, PAnsiChar(s), -1, Result, Len);
  end else
    Result := #0;
end;

function FreePWChar(ws: PWideChar): Bool;
begin
  //SysFreeString(ws);

  if ws <> nil then FreeMem(ws);
end;

turboPASCAL 5. Dez 2009 15:57

Re: String to PWideChar, wie wird es gemacht ?
 
*löscht mich*

Bernhard Geyer 5. Dez 2009 16:02

Re: String to PWideChar, wie wird es gemacht ?
 
Zitat:

Zitat von turboPASCAL
Delphi-Quellcode:
GetMem(Result, Len * 2);

Besser wohl noch 2 Byte mehr damit auch für das \0 als String-Abschlusszeichen platz ist.

turboPASCAL 5. Dez 2009 16:17

Re: String to PWideChar, wie wird es gemacht ?
 
:gruebel:

Hm, wenn ich einen Platz von 24 Chars reserviere und dieser wird voll ausgelastet mit 24 Zeichen, muss der dennoch "genullt" werden ?

Apollonius 5. Dez 2009 16:35

Re: String to PWideChar, wie wird es gemacht ?
 
Auf jeden Fall. Sonst weiß der Benutzer des PWideChars ja gar nicht, wo der String aufhört.

Bernhard Geyer 5. Dez 2009 16:49

Re: String to PWideChar, wie wird es gemacht ?
 
Zitat:

Zitat von turboPASCAL
:gruebel:

Hm, wenn ich einen Platz von 24 Chars reserviere und dieser wird voll ausgelastet mit 24 Zeichen, muss der dennoch "genullt" werden ?

Ja. P(Wide)Chars haben im gegensatz zum Delphi (Wide)String keine längenangabe sondern nur die Regel: "Lies alle Zeichen bis zum ersten \0". Deshalb auch der Name "Nullterminierter String"


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz