怎么把PAnsichar转换成PWidechar?

时间:2013-09-12 10:03:16

标签: delphi delphi-xe3 indy10

我在这里使用delphi-xe3中的windows API实现Ping功能 (http://delphi.about.com/od/internetintranet/l/aa081503a.htm)。

我遇到以下问题的问题。它显示错误不兼容的类型Pansichar和Pwidechar.I用PAnsichar替换Pchar现在它显示异常 '从HostName获取IP时出错。

我正在使用localhost进行测试。

请指导正确的转换。

const ADP_IP = '127.0.0.1';

procedure TranslateStringToTInAddr(AIP: string; var AInAddr);
var
  phe: PHostEnt;
  pac: PChar;
  GInitData: TWSAData;
begin
  WSAStartup($101, GInitData);
  try
    phe := GetHostByName(PChar(AIP));
    if Assigned(phe) then
    begin
      pac := phe^.h_addr_list^;
      if Assigned(pac) then
      begin
        with TIPAddr(AInAddr).S_un_b do begin
          s_b1 := Byte(pac[0]);
          s_b2 := Byte(pac[1]);
          s_b3 := Byte(pac[2]);
          s_b4 := Byte(pac[3]);
        end;
      end
      else
      begin
        raise Exception.Create('Error getting IP from HostName');
      end;
    end
    else
    begin
      raise Exception.Create('Error getting HostName');
    end;
  except
    FillChar(AInAddr, SizeOf(AInAddr), #0);
  end;
  WSACleanup;
end;

1 个答案:

答案 0 :(得分:4)

您不希望从PAnsiChar转换为PWideChar。在您的Unicode Delphi上,PChar映射到PWideChar。但gethostbyname收到PAnsiChar。您需要从Unicode转换为ANSI。

像这样编码:

phe := gethostbyname(PAnsiChar(AnsiString(AIP)));

换句话说,将您的字符串转换为AnsiString,然后转换为PAnsiChar。我个人将AIP参数声明为AnsiString

procedure TranslateStringToTInAddr(const AIP: AnsiString; var AInAddr);

然后将调用写入gethostbyname,如下所示:

phe := gethostbyname(PAnsiChar(AIP));

那个无类型的var参数对我来说很可疑。我认为它的使用没有令人信服的理由。将它声明为TIPAddr类型有什么问题?你的FillChar有点可疑。如何在无类型参数上使用SizeOf