用加载动态库Iphlpapi.dll的方法获取网卡信息.
1.定义结构体
#define MAX_ADAPTER_NAME_LENGTH 256
#define MAX_ADAPTER_DESCRIPTION_LENGTH 128
#define MAX_ADAPTER_ADDRESS_LENGTH 8
typedef struct
{
char String[4*4];
} IP_ADDRESS_STRING, *PIP_ADDRESS_STRING, IP_MASK_STRING, *PIP_MASK_STRING;
typedef struct _IP_ADDR_STRING
{
struct _IP_ADDR_STRING* Next;
IP_ADDRESS_STRING IpAddress;
IP_MASK_STRING IpMask;
DWORD Context;
} IP_ADDR_STRING, *PIP_ADDR_STRING;
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;
2.声明iphlpapi.dll中需要调用参数的调用方式为__stdcall,及参数类型
typedef DWORD (__stdcall* PGAINFO)(PIP_ADAPTER_INFO, PULONG);
3.主函数
HMODULE hInst = LoadLibrary("iphlpapi.dll");
if(!hInst)
printf("iphlpapi.dll no supported in this platform!\n");
PGAINFO pGAInfo = (PGAINFO)GetProcAddress(hInst, "GetAdaptersInfo");
if(pGAInfo == NULL)
{
printf("can't found GetAdapterInfo function!\n");
exit(0);
}
ULONG ulSize = 0;
PIP_ADAPTER_INFO pInfo=NULL, d=NULL;
while(pGAInfo(pInfo, &ulSize) != ERROR_SUCCESS)
{
delete pInfo;
int eSize = ulSize/sizeof(IP_ADAPTER_INFO);
if(ulSize%sizeof(IP_ADAPTER_INFO))
{
eSize++;
}
pInfo = (PIP_ADAPTER_INFO)new(IP_ADAPTER_INFO[eSize]);
}
//GetAdapterInfo返回的是一个键表结构的网卡信息,可以用循环遍历得到每一个网卡的信息
int i=0;
for(d=pInfo; d!=NULL; d=d->Next)
{
CString szNetInfo;
szNetInfo.Format("%d. 网卡:%s", ++i, d->Description);
cout<<szNetInfo<<endl;
szNetInfo.Format("MAC 地址: %02x-%02x-%02x-%02x-%02x-%02x", d->Address[0], d->Address[1],
d->Address[2], d->Address[3], d->Address[4], d->Address[5]);
cout<<szNetInfo<<endl;
szNetInfo.Format("IP 地址:%s", d->IpAddressList.IpAddress.String);
cout<<szNetInfo<<endl;
szNetInfo.Format("子网掩码:%s", d->IpAddressList.IpMask.String);
cout<<szNetInfo<<endl;
szNetInfo.Format("网关:%s", d->GatewayList.IpAddress.String);
cout<<szNetInfo<<endl;
}
delete []pInfo;
delete []d;
FreeLibrary(hInst);