Delphi 如何从PAnsichar转换为PWidechar?

Delphi 如何从PAnsichar转换为PWidechar?,delphi,delphi-xe3,indy10,Delphi,Delphi Xe3,Indy10,我从这里开始在delphi-xe3中使用windows API实现Ping函数 () 我对以下函数有问题。它显示错误不兼容的类型Pansichar和Pwidechar。我用Pansichar替换了Pchar,现在它显示异常 '从主机名获取IP时出错' 我正在用localhost测试它 请指导正确的转换方式 const ADP_IP = '127.0.0.1'; procedure TranslateStringToTInAddr(AIP: string; var AInAddr); var

我从这里开始在delphi-xe3中使用windows API实现Ping函数 ()

我对以下函数有问题。它显示错误不兼容的类型Pansichar和Pwidechar。我用Pansichar替换了Pchar,现在它显示异常 '从主机名获取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;

您不想从
PAnsiChar
转换为
PWideChar
。在Unicode Delphi上,
PChar
映射到
PWideChar
。但是
gethostbyname
接收
PAnsiChar
。您需要将Unicode转换为ANSI

将其编码如下:

phe := gethostbyname(PAnsiChar(AnsiString(AIP)));
换句话说,将字符串转换为
ansisting
,然后转换为
PAnsiChar
。我个人会将
AIP
参数声明为
ansisting

procedure TranslateStringToTInAddr(const AIP: AnsiString; var AInAddr);
然后将调用写入
gethostbyname
,如下所示:

phe := gethostbyname(PAnsiChar(AIP));

我觉得这个非类型化的
var
参数很可疑。我认为没有令人信服的理由使用它。将其声明为类型
TIPAddr
有什么不对?你的
FillChar
有点可疑。如何在非类型化参数上使用
SizeOf

谢谢@David,我是按你的方式做的。现在它没有显示任何错误,但也没有显示任何消息。我只是从网站上获取代码并尝试编译,我对windows api不太熟悉。所以我不知道为什么使用var AIPaddr或其他东西更好。您的代码不显示消息。无论如何,我的回答告诉您调用
gethostbyname
有什么问题。我答案中的代码正确地做到了这一点。请不要指望我调试你程序的其余部分。我回答了你问的问题。这就是它的工作原理。不,我的意思是我实现了我粘贴的链接中给出的全部代码,它显示了一条消息。非常感谢您的帮助,是的,它确实删除了错误。@XenonXe:通过消息,我理解您所说的没有引发异常,所以您所说的是
gethostbyname()
函数工作正常。但是,我同意@David的观点,即
var
参数应键入为
TIpAddr
,因为您的代码依赖于它来工作。最后一个异常块中的
FillChar
对我来说是错误的。你能解释一下吗?@AlexSC代码是从链接文章中逐字复制的,我觉得这篇文章有点可疑。你的猜测和我的一样好。