将 ansichar 数组复制到 char 数组 delphi 10.2

copy array of ansichar to array of char delphi 10.2

正如我们从 Delphi 2007 年及以下版本知道的那样,字符串不是 Unicode

字符为1个字节

AnsiChar 1 字节

从 Delphi 2009 年起,字符串为 Unicode

字符为2字节

AnsiChar 1 字节

当我将 Delphi 代码从 Delphi6 转换为 Delphi 10.2(unicode 字符串) 我遇到了一些函数使用 PAnsiChar 来填充 Char 数组的问题,但是传递的指针是 PChar,在非 Unicode 中 Delphi 我不会得到任何错误

但是我会在新的 Delphi 中出错 示例

procedure TswSocket.SetLocalHost(AHost : AnsiString);
var
  HostIpAddress : TIPAddress;
  Buffer: PChar;

  begin
  Buffer:=StrAlloc(Length(AHost)+1);
  strpcopy(Buffer,AHost);
  Buffer[Length(AHost)]:=#0;
  bLocalHost:=StrAlloc(MAXGETHOSTSTRUCT);
  hGetLocalHost:=WSAAsyncGetHostByName(Self.hWindow,WM_SOCKETGETHOSTBYNAME,Buffer,bLocalHost,MAXGETHOSTSTRUCT); // Buffer,bLocalHost must be PAnsiChar instead of PChar

WSAAsyncGetHostByName 将填充 bLocalHost

修复我使用的错误

procedure TswSocket.SetLocalHost(AHost : AnsiString);
var
  HostIpAddress : TIPAddress;
  Buffer,temp_Buffer : PAnsiChar;

  begin
  Buffer:=AnsiStrAlloc(Length(AHost)+1);
  strpcopy(Buffer,AHost);
  Buffer[Length(AHost)]:=#0;

  temp_Buffer:=AnsiStrAlloc(MAXGETHOSTSTRUCT);
  bLocalHost:=StrAlloc(MAXGETHOSTSTRUCT);
  hGetLocalHost:=WSAAsyncGetHostByName(Self.hWindow,WM_SOCKETGETHOSTBYNAME,Buffer,temp_Buffer,MAXGETHOSTSTRUCT); // no error : Buffer,temp_Buffer is PAnsiChar 

现在 temp_Buffer(AnsiChar 数组)中的结果,但我们需要 bLocalHost(Char 数组)中的结果

有没有类似这个copy(PAnsiChar,PChar,size)的函数 将 PAnsiChar 的内容复制到 PChar,如数组,不会因 Unicode 而丢失数据,因此如果 temp_Buffer ='some data' 那么 bLocalHost 必须是 ='some data' ?

没有函数可以在不转换数据的情况下将 AnsiChar 数组的内容分配给 (Wide)Char 数组。为此,请使用 Win32 API 的 MultiByteToWideChar() function, or the RTL's UnicodeFromLocaleChars() 函数。

否则,您可以将 bLocalHost 变量更改为 AnsiChar 数组。或者,您可以将其更改为 (Unicode)String 并让 RTL 在直接向其分配空终止 (P)AnsiChar 时为您转换数据。