unit iphlp; 
 
interface 
 
uses Windows, System; 
 
const 
  MAX_HOSTNAME_LEN    = 128; 
  MAX_DOMAIN_NAME_LEN = 128; 
  MAX_SCOPE_ID_LEN    = 256; 
 
type 
  // 
  // TIPAddressString - store an IP address or mask as dotted decimal string 
  // 
  PIPAddressString = ^TIPAddressString; 
  PIPMaskString    = ^TIPAddressString; 
  TIPAddressString = record 
    _String: array[0..(4 * 4) - 1] of Char; 
  end; 
  TIPMaskString = TIPAddressString; 
 
  // 
  // TIPAddrString - store an IP address with its corresponding subnet mask, 
  // both as dotted decimal strings 
  // 
  PIPAddrString = ^TIPAddrString; 
  TIPAddrString = packed record 
    Next: PIPAddrString; 
    IpAddress: TIPAddressString; 
    IpMask: TIPMaskString; 
    Context: DWORD; 
  end; 
 
  // 
  // FIXED_INFO - the set of IP-related information which does not depend on DHCP 
  // 
  PFixedInfo = ^TFixedInfo; 
  TFixedInfo = packed record 
    HostName: array[0..MAX_HOSTNAME_LEN + 4 - 1] of Char; 
    DomainName: array[0..MAX_DOMAIN_NAME_LEN + 4 - 1] of Char; 
    CurrentDnsServer: PIPAddrString; 
    DnsServerList: TIPAddrString; 
    NodeType: UINT; 
    ScopeId: array[0..MAX_SCOPE_ID_LEN + 4 - 1] of Char; 
    EnableRouting, 
    EnableProxy, 
    EnableDns: UINT; 
  end; 
 
 
function GetNetworkParams(pFixedInfo: PFixedInfo; pOutBufLen: PULONG): DWORD; stdcall; 
 
  // Get machine DNS Servers and return them in the provided StringList. This list should have been 
  // already created by the calling program before performing this call 
procedure GetDNSServers(AList: TStringList); 
 
 
implementation 
 
const 
  {$IFDEF MSWINDOWS} 
  iphlpapidll = 'iphlpapi.dll'; 
  {$ENDIF} 
 
function GetNetworkParams; external iphlpapidll Name 'GetNetworkParams'; 
 
 
procedure GetDNSServers(AList: TStringList); 
var 
  pFI: PFixedInfo; 
  pIPAddr: PIPAddrString; 
  OutLen: Cardinal; 
begin 
  AList.Clear; 
  OutLen := SizeOf(TFixedInfo); 
  GetMem(pFI, SizeOf(TFixedInfo)); 
  try 
    if GetNetworkParams(pFI, @OutLen) = ERROR_BUFFER_OVERFLOW then 
    begin 
      ReallocMem(pFI, OutLen); 
      if GetNetworkParams(pFI, @OutLen) <> NO_ERROR then Exit; 
    end; 
    // If there is no network available there may be no DNS servers defined 
    if pFI^.DnsServerList.IpAddress._String[0] = #0 then Exit; 
    // Add first server 
    AList.Add(pFI^.DnsServerList.IpAddress._String); 
    // Add rest of servers 
    pIPAddr := pFI^.DnsServerList.Next; 
    while Assigned(pIPAddr) do 
    begin 
      AList.Add(pIPAddr^.IpAddress._String); 
      pIPAddr := pIPAddr^.Next; 
    end; 
  finally 
    FreeMem(pFI); 
  end; 
end; 
 
end. 
 
 
 
  
                       |