【问题标题】:How to convert from PAnsichar to PWidechar?如何从 PAnsichar 转换为 PWidechar?
【发布时间】:2013-09-12 10:03:15
【问题描述】:

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

我在使用以下函数时遇到问题。它显示错误类型 Pansichar 和 Pwidechar 不兼容。我将 Pchar 替换为 PAnsichar 现在它显示异常 '从主机名获取 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;

【问题讨论】:

    标签: delphi delphi-xe3 indy10


    【解决方案1】:

    您不想从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 的。所以我不知道为什么最好使用 var AIPaddr 或其他东西。
    • 您的代码不显示消息。无论如何,我的回答告诉你你打电话给gethostbyname 出了什么问题。我的答案中的代码正确地做到了这一点。请不要指望我调试你程序的其余部分。我回答了你问的问题。这就是 SO 的工作原理。
    • 不,我的意思是我实现了我粘贴的链接中给出的整个代码,它显示了消息。delphi.about.com/od/internetintranet/l/aa081503a.htm。非常感谢您的帮助,是的,它确实消除了错误。
    • @XenonXe: by message 我理解你的意思是没有引发异常,所以你的意思是gethostbyname() 函数工作正常。但是,我同意@David 的观点,即var 参数应输入为TIpAddr,因为您的代码依赖于它才能工作。最后一个异常块中的FillChar 对我来说很神秘。你能解释一下吗?
    • @AlexSC 该代码是从链接的文章中逐字复制的,这对我来说很可疑。你的猜测和我的一样好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 2010-09-21
    相关资源
    最近更新 更多