Сообщение об ошибке является правильным, и если код, скомпилированный в более ранних версиях Delphi, был вызван недостатком этих более ранних версий компилятора.
Динамический массив - это больше, чем просто указатель на первыйэлемент.Он также инкапсулирует метаданные, в которых хранится длина массива и счетчик ссылок.Таким образом, ваш актерский состав недействителен.Вы получили этот неверный код, потому что не пытались получить доступ к этим метаданным, но это так же случайно, как и по намерению.
Не пытайтесь привести к динамическому массиву.Вместо этого используйте арифметику указателя.Например:
function TIdStackWindows.WSGetServByPort(
const APortNumber: Integer): TIdStrings;
var
ps: PServEnt;
p: PPChar;
begin
Result := TIdStringList.Create;
try
ps := GetServByPort(HToNs(APortNumber), nil);
if ps <> nil then
begin
Result.Add(ps^.s_name);
p := PPChar(ps^.s_aliases); // cast needed due to Indy record type's use of un-nameable type
while p^ <> nil do
begin
Result.Add(p^);
inc(p);
end;
end;
except
Result.Free;
raise;
end;
end;
Я изменил объявление типа списка псевдонимов на PPChar
, чтобы избежать несовместимых ошибок типа при назначении локальной переменной этого типа.
Обратите внимание, что я исправил вашу обработку исключений, которая ранее поглощала исключения и возвращала недопустимую ссылку на объект.