用加载动态库Iphlpapi.dll的方法获取网卡信息

本文介绍了一种通过加载Iphlpapi.dll动态链接库来获取计算机网络适配器信息的方法。该方法定义了特定的数据结构并利用GetAdaptersInfo函数来收集包括网卡名称、MAC地址、IP地址等在内的详细信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用加载动态库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);



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值