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:
#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;
}
Permalink: Code Library - How to get the local DNS server record
Subcribe the update with Google Reader.
RSS feed for comments on this post · TrackBack URI
Leave a reply