作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用delphi-xe3中的Windows API从这里实现Ping功能(http://delphi.about.com/od/internetintranet/l/aa081503a.htm)。
我在使用以下函数时遇到问题。它显示错误,类型 Pansichar 和 Pwidechar 不兼容。我用 PAnsichar 替换了 Pchar,现在它显示异常“从主机名获取 IP 时出错”。
我正在使用本地主机测试它。
请指导什么是正确的转换。
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)));
换句话说,将字符串转换为 AnsiString
,然后转换为 PAnsiChar
。就我个人而言,我会将 AIP
参数声明为 AnsiString
。
procedure TranslateStringToTInAddr(const AIP: AnsiString; var AInAddr);
然后像这样编写对 gethostbyname
的调用:
phe := gethostbyname(PAnsiChar(AIP));
那个无类型的 var
参数对我来说看起来很可疑。我认为没有令人信服的理由使用它。将其声明为 TIPAddr
类型有什么问题吗?您的 FillChar
有点可疑。如何在非类型化参数上使用 SizeOf
?
关于delphi - 如何从 PAnsichar 转换为 PWidechar?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18761248/
我是一名优秀的程序员,十分优秀!