我在这里使用delphi-xe3中的windows API实现Ping功能 (http://delphi.about.com/od/internetintranet/l/aa081503a.htm)。
我遇到以下问题的问题。它显示错误不兼容的类型Pansichar和Pwidechar.I用PAnsichar替换Pchar现在它显示异常 '从HostName获取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;
答案 0 :(得分:4)
您不希望从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
?