首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将PAnsichar转换为PWidechar?

如何将PAnsichar转换为PWidechar?
EN

Stack Overflow用户
提问于 2013-09-12 18:03:16
回答 1查看 11.8K关注 0票数 3

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

我遇到了以下function.It问题,显示错误,不兼容类型Pansichar和Pwidechar.我用PAnsichar替换了Pchar,现在它显示异常‘从主机名获取IP时出错’。

我正在用localhost测试它。

请指导什么是正确的转换。

代码语言:javascript
复制
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;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-12 18:11:04

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

代码如下所示:

代码语言:javascript
复制
phe := gethostbyname(PAnsiChar(AnsiString(AIP)));

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

代码语言:javascript
复制
procedure TranslateStringToTInAddr(const AIP: AnsiString; var AInAddr);

然后像这样编写对gethostbyname的调用:

代码语言:javascript
复制
phe := gethostbyname(PAnsiChar(AIP));

这个非类型化的var参数在我看来是可疑的。我看不到使用它的令人信服的理由。将其声明为TIPAddr类型有什么错?您的FillChar有点可疑。如何在非类型化参数上使用SizeOf

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18761248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档