скопировать массив ansichar в массив char delphi 10.2 - PullRequest
3 голосов
/ 26 марта 2019

как мы знаем из 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'?

1 Ответ

2 голосов
/ 26 марта 2019

Нет функции для присвоения содержимого массива AnsiChar массиву (Wide)Char без преобразования данных.Для этой цели используйте функцию Win32 API MultiByteToWideChar() или функцию RTL UnicodeFromLocaleChars().

В противном случае вы можете изменить переменную bLocalHost набыть массивом AnsiChar.Или вы можете изменить его на (Unicode)String и позволить RTL преобразовать данные для вас при назначении для него (P)AnsiChar с нулевым символом в конце.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...