как мы знаем из Delphi 2007 и ниже, строки не являются Unicode
Char равен 1 байту
AnsiChar 1 байт
из Delphi 2009 и выше строки Unicode
Char - 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)
естьлюбая функция, подобная этой копии (PAnsiChar, PChar, size) копирует содержимое PAnsiChar в массив, подобный PChar, без потери данных из-за Unicode, поэтому, если temp_Buffer = 'some data', то bLocalHost должно быть = 'some data'?