If you don’t have Iphlpapi.lib installed, you can retrieve the local DNS server in the following way.

The main step is load “Iphlpapi.dll” with ::LoadLibary method and call ::GetProcAddress to get the “GetNetworkParams”.

Here is the full source:




#include “stdafx.h”
#include
#include

#define MAX_HOSTNAME_LEN 128
#define MAX_DOMAIN_NAME_LEN 128
#define MAX_SCOPE_ID_LEN 256

typedef struct _IP_ADDR_STRING {
struct _IP_ADDR_STRING* Next;
BYTE IpAddress[16];
BYTE IpMask[16];
DWORD Context;
}IP_ADDR_STRING, *PIP_ADDR_STRING;

typedef struct {
char HostName [MAX_HOSTNAME_LEN + 4] ;
char DomainName [MAX_DOMAIN_NAME_LEN + 4] ;
PIP_ADDR_STRING CurrentDnsServer ;
IP_ADDR_STRING DnsServerList ;
UINT NodeType ;
char ScopeId [MAX_SCOPE_ID_LEN + 4] ;
UINT EnableRouting ;
UINT EnableProxy ;
UINT EnableDns ;
} FIXED_INFO, *PFIXED_INFO ;

typedef DWORD (__stdcall *pGetNetworkParams)(PFIXED_INFO,PULONG);

int main()
{
FIXED_INFO * FixedInfo;
ULONG ulOutBufLen;
HINSTANCE hIphlpapiDll;
pGetNetworkParams p;

__try
{
hIphlpapiDll=::LoadLibrary(“Iphlpapi.dll”);
p=(pGetNetworkParams)::GetProcAddress(hIphlpapiDll,
“GetNetworkParams”);

FixedInfo = (FIXED_INFO *) GlobalAlloc( GPTR, sizeof( FIXED_INFO ) );
ulOutBufLen = sizeof( FIXED_INFO );

if( ERROR_BUFFER_OVERFLOW ==(*p)( FixedInfo, &ulOutBufLen ) )
{
GlobalFree( FixedInfo );
FixedInfo = (FIXED_INFO *)GlobalAlloc( GPTR, ulOutBufLen );
}

(*p)( FixedInfo, &ulOutBufLen );

printf( “Host Name: %s\n”, FixedInfo->HostName );
printf( “DNS Servers: %s\n”,FixedInfo->DnsServerList.IpAddress )
;

}
__except( EXCEPTION_EXECUTE_HANDLER){}
::FreeLibrary(hIphlpapiDll);
::GlobalFree( FixedInfo );
return 1;
}