Ple*_*rds 2 delphi ip dns delphi-xe3
我有这个功能,如果我使用GetIP('server-name')或GetIP('google.com')在我的Delphi 2006 中检索IP地址.
但现在我正在尝试它,Delphi-XE3它不起作用.有任何想法吗?
function GetIP(const HostName: string): string;
var
WSAData: TWSAData;
R: PHostEnt;
A: TInAddr;
begin
Result := IPNULL; // '0.0.0.0'
WSAStartup($101, WSAData);
R := Winsock.GetHostByName(PAnsiChar(HostName));
if Assigned(R) then
begin
A := PInAddr(r^.h_Addr_List^)^;
Result := string(WinSock.inet_ntoa(A));
end;
end;
Run Code Online (Sandbox Code Playgroud)
似乎R没有被分配,因为结果总是如此'0.0.0.0'
这两个版本的Delphi之间的最大区别在于,现代Delphi本身使用宽UTF-16编码字符串,旧版本使用ANSI编码字符串.
许多API函数都有宽版本和ANSI版本.但是你在Winsock中调用的函数只能坚持8位.
您可以通过显式使用8位文本编码使您的代码像以前一样工作.
function GetIP(const HostName: string): string;
var
WSAData: TWSAData;
R: PHostEnt;
A: TInAddr;
begin
Result := IPNULL; // '0.0.0.0'
WSAStartup($101, WSAData);
R := Winsock.GetHostByName(PAnsiChar(AnsiString(HostName)));
if Assigned(R) then
begin
A := PInAddr(r^.h_Addr_List^)^;
Result := WinSock.inet_ntoa(A);
end;
end;
Run Code Online (Sandbox Code Playgroud)
现在,细心的读者会说:
如果主机名具有非ASCII字符怎么办?受这些相当微弱的固定长度8位编码约束不是一种耻辱吗?
那么,现在将主机名转换为地址的推荐功能是Unicode函数GetAddrInfoW.