Delphi XE2不兼容类型指针和PAnsiChar

poo*_*nam 2 delphi delphi-xe2

我正在使用Delphi XE2编译我的应用程序.它是在delphi 7中开发的.我的代码如下:

type
 Name = array[0..100] of PChar;
 PName = ^Name;
var
  HEnt: pHostEnt;
  HName: PName;
  WSAData: TWSAData;
  i: Integer;

begin
     Result := False;
     if WSAStartup($0101, WSAData) <> 0 then begin
     WSAErr := 'Winsock is not responding."';
       Exit;
     end;
    IPaddr := '';
    New(HName);


 if GetHostName(HName^, SizeOf(Name)) = 0 then <-----ERROR
   begin
      HostName := StrPas(HName^);      

      HEnt := GetHostByName(HName^);    
            "
            "
         so on...
   end;
Run Code Online (Sandbox Code Playgroud)

当我尝试编译代码时,我收到以下错误: 在此输入图像描述

当我在另一个应用程序中尝试此代码时,它在Delphi 7中工作正常.如何从字符指针转换为PAnsiChar类型,使其在Delphi XE2上运行?

Sim*_*erg 6

我的德尔福知识可能有点生疏,但据我记忆:

PChar(有点像,不完全是)指向字符串本身的指针,所以这种类型实际上是101个PChars(字符串)的数组:

Name = array[0..100] of PChar;

我认为你应该改变它array [0..100] of Char,或者为什么不从一开始就宣布HNamePAnsiChar权利?


Rem*_*eau 6

这不是正确的使用方法gethostname().请改用:

var
  HName: array[0..100] of AnsiChar;
  HEnt: pHostEnt;
  WSAData: TWSAData;
  i: Integer;
begin
  Result := False;
  if WSAStartup($0101, WSAData) <> 0 then begin
    WSAErr := 'Winsock is not responding."';
    Exit;
  end;
  IPaddr := '';

  if gethostname(HName, SizeOf(Name)) = 0 then
  begin
    HostName := StrPas(HName);
    HEnt := gethostbyname(HName);
    ...
  end;
  ...
end;
Run Code Online (Sandbox Code Playgroud)