我在这里使用delphi-xe3中的windows API实现Ping函数(http://delphi.about.com/od/internetintranet/l/aa081503a.htm)。
我遇到了以下function.It问题,显示错误,不兼容类型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;发布于 2013-09-12 18:11:04
您不希望从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?
https://stackoverflow.com/questions/18761248
复制相似问题