如何从PAnsiChar转换为PWideChar?

3
我正在使用Delphi-XE3从这里实现使用Windows API的Ping函数(http://delphi.about.com/od/internetintranet/l/aa081503a.htm)。但是我遇到了以下函数的问题。它显示不兼容的类型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;
1个回答

6

您不需要将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 呢?


谢谢@David,我按照您的方式做了。现在没有显示任何错误,但也没有显示任何消息。我只是从网站上复制了代码并尝试编译它,我对 Windows API 不太熟悉,所以我不知道为什么最好使用变量AIPaddr还是其他东西。 - Xenon Xe
1
你的代码没有显示消息。不管怎样,我的答案告诉你调用gethostbyname时出了什么问题。我回答了你提出的问题。请不要期望我调试你程序的其余部分。这就是SO的工作方式。 - David Heffernan
不,我的意思是我实现了我粘贴的链接中提供的整个代码,并且它显示了消息。非常感谢您的帮助,是的,它确实消除了错误。 - Xenon Xe
@XenonXe:通过_message_,我理解你的意思是没有引发异常,所以你的意思是gethostbyname()函数正常工作。然而,我同意@David的观点,即var参数应该被定义为TIpAddr类型,因为你的代码依赖于它来工作。最后一个异常块中的FillChar对我来说很神秘。你能解释一下吗? - AlexSC
不好意思,我不能解释它,因为这不是我的代码。我需要一个ping函数并尝试使用了这个Windows函数。我正在努力理解这段代码。我需要一点指导。我应该自己实现还是使用Windows API? - Xenon Xe
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接