本机IP地址uses Winsock;function GetIP:String;
VAR
  ch: Array [1..32] OF Char;
  i: Integer;
  S: String;
  WSData: TWSAData;
  MyHost: PHostEnt;
begin
  if WSAstartup(2,WSData) <> 0 then Halt(2);
  try
    if GetHostName(@ch[1],32) <> 0 then Halt(3);
    except halt(3);
  end;
  MyHost := GetHostByName(@ch[1]);
  if MyHost = nil then 
    Halt(4) 
  else
  begin
    for i := 0 to 3 do
    begin
      S := S + Inttostr(Ord(MyHost.H_Addr^[i]));
      if i < 3 then 
        S := S + '.';
    end;
  end;
  Result:=s;
end;

解决方案 »

  1.   

    unit USock; interface uses Windows, Winsock; 
     {此函数列举出所有的TCP/IP连接,并返回一个由回车换行符分隔的字符串,包含以下信息:
    IP, NetMask, BroadCast-Address, Up/Down status, Broadcast support, Loopback 
    如果你将这个字符串赋给TMemo(它的Memo.Lines.Text属性),你可以看到更清晰的结果。
    使用此函数,你需要Win98/ME/2K, 95 OSR 2 或者NT service pack #3,因为程序会使用到WinSock 2(WS2_32.DLL)。} function EnumInterfaces(var sInt: string): Boolean; 
    function WSAIoctl(s: TSocket; cmd: DWORD; lpInBuffer: PCHAR; dwInBufferLen: DWORD;lpOutBuffer: PCHAR; dwOutBufferLen: DWORD;lpdwOutBytesReturned: LPDWORD;lpOverLapped: POINTER;lpOverLappedRoutine: POINTER): Integer; stdcall; external 'WS2_32.DLL'; const
    SIO_GET_INTERFACE_LIST = $4004747F; 
    IFF_UP = $00000001; 
    IFF_BROADCAST = $00000002; 
    IFF_LOOPBACK = $00000004; 
    IFF_POINTTOPOINT = $00000008; 
    IFF_MULTICAST = $00000010; 
     
    type sockaddr_gen = packed record
      AddressIn: sockaddr_in; 
      filler: packed array[0..7] of char; 
    end; type INTERFACE_INFO = packed record 
      iiFlags: u_long; // Interface flags 
      iiAddress: sockaddr_gen; // Interface address 
      iiBroadcastAddress: sockaddr_gen; // Broadcast address 
      iiNetmask: sockaddr_gen; // Network mask 
     end; implementation 
    {------------------------------------------------------------------- 
     1. 打开Winsock
     2. 创建一个socket
     3. 调用WSAIOCtl获取网络连接
     4. 对每个连接,获取它的IP、掩码、广播地址、状态
     5. 将信息填充到一个由CDLF分隔的字符串中
     6. 结束
     --------------------------------------------------------------------} 
    function EnumInterfaces(var sInt: string): Boolean; 
    var
      s: TSocket; 
      wsaD: WSADATA; 
      NumInterfaces: Integer; 
      BytesReturned, SetFlags: u_long; 
      pAddrInet: SOCKADDR_IN; 
      pAddrString: PCHAR; 
      PtrA: pointer; 
      Buffer: array[0..20] of INTERFACE_INFO; 
      i: Integer; 
    begin 
     result := true; // Initialize 
     sInt := ''; 
     WSAStartup($0101, wsaD); // Start WinSock 
     // You should normally check 
     // for errors here
     s := Socket(AF_INET, SOCK_STREAM, 0); // Open a socket 
     if (s = INVALID_SOCKET) then exit; 
     try // Call WSAIoCtl 
      PtrA := @bytesReturned; 
      if (WSAIoCtl(s, SIO_GET_INTERFACE_LIST, nil, 0, @Buffer, 1024, PtrA, nil,nil)<>SOCKET_ERROR) then 
      begin // If ok, find out how 
      // many interfaces exist 
        NumInterfaces := BytesReturned div SizeOf(INTERFACE_INFO); 
        for i := 0 to NumInterfaces - 1 do // For every interface 
        begin 
          pAddrInet := Buffer[i].iiAddress.addressIn; // IP ADDRESS 
          pAddrString := inet_ntoa(pAddrInet.sin_addr); 
          sInt := sInt + ' IP=' + pAddrString + ','; 
          pAddrInet := Buffer[i].iiNetMask.addressIn; // SUBNET MASK 
          pAddrString := inet_ntoa(pAddrInet.sin_addr); 
          sInt := sInt + ' Mask=' + pAddrString + ','; 
          pAddrInet := Buffer[i].iiBroadCastAddress.addressIn; // Broadcast addr 
          pAddrString := inet_ntoa(pAddrInet.sin_addr); 
          sInt := sInt + ' Broadcast=' + pAddrString + ','; 
          SetFlags := Buffer[i].iiFlags; 
          if (SetFlags and IFF_UP) = IFF_UP then 
            sInt := sInt + ' Interface UP,' // Interface up/down 
          else
            sInt := sInt + ' Interface DOWN,'; 
          if (SetFlags and IFF_BROADCAST) = IFF_BROADCAST then // Broadcasts 
            sInt := sInt + ' Broadcasts supported,' // supported or 
          else // not supported 
            sInt := sInt + ' Broadcasts NOT supported,'; 
          if (SetFlags and IFF_LOOPBACK) = IFF_LOOPBACK then // Loopback or 
            sInt := sInt + ' Loopback interface' 
          else 
            sInt := sInt + ' Network interface'; // normal 
          sInt := sInt + #13#10; // CRLF between 
          // each interface 
        end; 
      end; 
     except 
     end; 
     CloseSocket(s); 
     WSACleanUp; 
     result := false; 
    end; end.