Mega Code Archive

 
Categories / Delphi / LAN Web TCP
 

Get the local DNS servers list

Title: get the local DNS servers list? 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.