正如我们从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 Array)中,但我们需要在bLocalHost(Char数组)中得到结果

有没有像这样的副本(PAnsiChar,PChar,大小)的功能
 将PAnsiChar的内容复制到PChar之类的数组,而不会由于Unicode而丢失数据,因此,如果temp_Buffer =“ some data”,则bLocalHost必须是“ some data”吗?

最佳答案

没有在不转换数据的情况下将AnsiChar数组的内容分配给(Wide)Char数组的功能。为此,请使用Win32 API的MultiByteToWideChar()函数或RTL的UnicodeFromLocaleChars()函数。

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

07-24 13:39