昨天搞 了一天的注册表,今天把读取网卡信息搞定了,相比之下,速度要比昨天快的多。孰能生巧,大家多多联系啊 !~不废话,直接上。
PIP_ADAPTER_INFO 结构 存储网络适配器信息
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;
GetAdaptersInfo 函数 获取所有的适配器信息
DWORD GetAdaptersInfo(
PIP_ADAPTER_INFO pAdapterInfo,
PULONG pOutBufLen
);
IP_ADDR_STRING 结构 IP列表
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;
直接付源码:
Code
// network.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <iptypes.h>
#include <winnt.h>
#include <iphlpapi.h>
#pragma comment(lib,"iphlpapi")
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
PIP_ADAPTER_INFO pAdapter=NULL; //初始化两个结构
PIP_ADAPTER_INFO pAdapterInfo;
DWORD dwRes=0; //获取适配器信息返回状态
DWORD dwOutBuff=sizeof(IP_ADAPTER_INFO); //为PIP_ADAPTER_INFO动态分配内存设置大小
pAdapterInfo=(IP_ADAPTER_INFO *)new (char[dwOutBuff]); //动态分配内存。
if(GetAdaptersInfo(pAdapterInfo,&dwOutBuff)==ERROR_BUFFER_OVERFLOW) //判断获取信息初始化适配器结构是否出现错误,
{
delete pAdapterInfo; //删除动态内存
pAdapterInfo=(IP_ADAPTER_INFO *)new (char[dwOutBuff]); //从新分配内存
}
dwRes=GetAdaptersInfo(pAdapterInfo,&dwOutBuff); //获取是适配器信息,填充PIP_ADAPTER_INFO结构
if(dwRes==NO_ERROR)
{
pAdapter=pAdapterInfo;
while(pAdapter)
{
WCHAR MAC[20]={0}; //存储网卡mac
swprintf(MAC,L"%.2X-%.2X-%.2X-%.2X-%.2X-%.2X", //格式化填充mac
pAdapter->Address[0],
pAdapter->Address[1],
pAdapter->Address[2],
pAdapter->Address[3],
pAdapter->Address[4],
pAdapter->Address[5]);
wcout<<MAC<<endl;
IP_ADDR_STRING *pIpAddr; //创建ip列表指针
pIpAddr=&(pAdapter->IpAddressList); //指针指向ip列表
WCHAR IP[260]={0};
WCHAR m_addr[200]={0};
if(pIpAddr) //如果指针不指向NULL
{
mbstowcs(m_addr,pIpAddr->IpAddress.String,sizeof pIpAddr->IpAddress.String); //获取ip地址,然后转换为WCHAR
wcscat(IP,m_addr); //连接ip
pIpAddr=pIpAddr->Next; //指向下个适配器IP
}
while(pIpAddr)
{
memset(m_addr,0,200); //重置m_addr为0
mbstowcs(m_addr,pIpAddr->IpAddress.String,sizeof pIpAddr->IpAddress.String);
wcscat(IP,L"-");
wcscat(IP,m_addr);
pIpAddr=pIpAddr->Next;
}
memset(m_addr,0,200);
wcout<<IP<<endl;
pAdapter=pAdapter->Next;
}
}
delete pAdapterInfo;
return 0;
}