Delphi 如何从PAnsichar转换为PWidechar?
我从这里开始在delphi-xe3中使用windows API实现Ping函数 () 我对以下函数有问题。它显示错误不兼容的类型Pansichar和Pwidechar。我用Pansichar替换了Pchar,现在它显示异常 '从主机名获取IP时出错' 我正在用localhost测试它 请指导正确的转换方式Delphi 如何从PAnsichar转换为PWidechar?,delphi,delphi-xe3,indy10,Delphi,Delphi Xe3,Indy10,我从这里开始在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
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;
您不想从
PAnsiChar
转换为PWideChar
。在Unicode Delphi上,PChar
映射到PWideChar
。但是gethostbyname
接收PAnsiChar
。您需要将Unicode转换为ANSI
将其编码如下:
phe := gethostbyname(PAnsiChar(AnsiString(AIP)));
换句话说,将字符串转换为ansisting
,然后转换为PAnsiChar
。我个人会将AIP
参数声明为ansisting
procedure TranslateStringToTInAddr(const AIP: AnsiString; var AInAddr);
然后将调用写入gethostbyname
,如下所示:
phe := gethostbyname(PAnsiChar(AIP));
我觉得这个非类型化的
var
参数很可疑。我认为没有令人信服的理由使用它。将其声明为类型TIPAddr
有什么不对?你的FillChar
有点可疑。如何在非类型化参数上使用SizeOf
?谢谢@David,我是按你的方式做的。现在它没有显示任何错误,但也没有显示任何消息。我只是从网站上获取代码并尝试编译,我对windows api不太熟悉。所以我不知道为什么使用var AIPaddr或其他东西更好。您的代码不显示消息。无论如何,我的回答告诉您调用gethostbyname
有什么问题。我答案中的代码正确地做到了这一点。请不要指望我调试你程序的其余部分。我回答了你问的问题。这就是它的工作原理。不,我的意思是我实现了我粘贴的链接中给出的全部代码,它显示了一条消息。非常感谢您的帮助,是的,它确实删除了错误。@XenonXe:通过消息,我理解您所说的没有引发异常,所以您所说的是gethostbyname()
函数工作正常。但是,我同意@David的观点,即var
参数应键入为TIpAddr
,因为您的代码依赖于它来工作。最后一个异常块中的FillChar
对我来说是错误的。你能解释一下吗?@AlexSC代码是从链接文章中逐字复制的,我觉得这篇文章有点可疑。你的猜测和我的一样好。