3

我从这里(http://delphi.about.com/od/internetintranet/l/aa081503a.htm)在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;
4

1 回答 1

5

您不想从转换PAnsiCharPWideChar. 在您的 Unicode Delphi 上,您PChar映射到PWideChar. 而是gethostbynamePAnsiChar。您需要从 Unicode 转换为 ANSI。

像这样编码:

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

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

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

然后把调用写成gethostbyname这样:

phe := gethostbyname(PAnsiChar(AIP));

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

于 2013-09-12T10:11:04.457 回答