2

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;

結果Rが常に'0.0.0.0'

4

2 に答える 2

11

これら 2 つのバージョンの 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;

さて、観察力のある読者は次のように言うでしょう:

ホスト名に ASCII 以外の文字が含まれている場合はどうなりますか? これらのかなり脆弱な固定長の 8 ビット エンコーディングに制約されるのは残念なことではありませんか?

さて、最近ホスト名をアドレスに変換するための推奨関数は、Unicode 関数GetAddrInfoW です

于 2013-08-15T20:30:05.370 に答える