IP_ADAPTER_INFO 结构具有很大的信息量,包含了适配的描述,IP,MAC,MaskIp等,该结构是链表形式,通过遍历可实现多所有适配器信息的提取,使用比较简单。
typedef struct _IP_ADAPTER_INFO
{ struct _IP_ADAPTER_INFO* Next;
DWORD ComboIndex;
char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4];
char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4];
UINT AddressLength; BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH];
DWORD Index; UINT Type;
UINT DhcpEnabled;
PIP_ADDR_STRING CurrentIpAddress;
IP_ADDR_STRING IpAddressList;
IP_ADDR_STRING GatewayList;
IP_ADDR_STRING DhcpServer;
BOOL HaveWins;
IP_ADDR_STRING PrimaryWinsServer;
IP_ADDR_STRING SecondaryWinsServer;
time_t LeaseObtained;
time_t LeaseExpires;
} IP_ADAPTER_INFO, *PIP_ADAPTER_INFO;
例子:
/*********************************
* 函数: BOOL GetNetAddress()
* 作用: 获取IP地址(可以是多个IP地址,包括虚拟机IP)
* 返回:成功返回TRUE,错误返回FALSE;
*********************************/
BOOL CGetComputerInfo::GetNetAddress()
{
IP_ADAPTER_INFO * pInfo = NULL ;
unsigned long ulLength=sizeof (IP_ADAPTER_INFO );
if ( GetAdaptersInfo( pInfo , &ulLength) == ERROR_SUCCESS)
{
return FALSE;
}
GlobalFree (pInfo );
pInfo = (IP_ADAPTER_INFO *) malloc (ulLength );
if( GetAdaptersInfo(pInfo ,&ulLength)== NO_ERROR)
{
//遍历多个适配器
while (pInfo)
{
//MAC地址
IP_ADDR_STRING* ipList = &(pInfo->IpAddressList);
int macLen = pInfo->AddressLength;
BYTE * lpByteMack = pInfo->Address;
WCHAR lpMack[MAX_PATH]={0};
StringCchPrintfW(lpMack,MAX_PATH,_T("%02x-%02x-%02x-%02x-%02x-%02x"),
lpByteMack[0],lpByteMack[1],lpByteMack[2],
lpByteMack[3],lpByteMack[4],lpByteMack[5]);
XMLitemAdd(_T("MAC address"),lpMack);
while (ipList)
{
//IP地址
IP_ADDRESS_STRING ipAdree = ipList->IpAddress;
LPWSTR lpIPaddress = ANIStoWideChar(ipAdree.String,strlen(ipAdree.String));
if (lpIPaddress!=NULL)
{
XMLitemAdd(_T("IP Addree"),lpIPaddress);
}
delete []lpIPaddress;
lpIPaddress = NULL;
//获取子网
IP_MASK_STRING ipMask = ipList->IpMask;
LPWSTR lpIPmask = ANIStoWideChar(ipMask.String,strlen(ipMask.String));
if (lpIPmask != NULL)
{
XMLitemAdd(_T("IPmask"),lpIPmask);
}
delete [] lpIPmask;
lpIPmask = NULL;
ipList=ipList->Next;
}
pInfo = pInfo->Next;
}
}
else
{
return FALSE;
}
return TRUE;
}