获取mac地址的两种方式
--------------------------------------------
AnsiString GetAllMac()
{
AnsiString AllMac = "";
//PIP_ADAPTER_INFO结构体指针存储本机网卡信息
PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();
//得到结构体大小,用于GetAdaptersInfo参数
unsigned long stSize = sizeof(IP_ADAPTER_INFO);
//调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量
int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);
if (ERROR_BUFFER_OVERFLOW==nRel)
{
//如果函数返回的是ERROR_BUFFER_OVERFLOW
//则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小
//这也是说明为什么stSize既是一个输入量也是一个输出量
//释放原来的内存空间
delete pIpAdapterInfo;
//重新申请内存空间用来存储所有网卡信息
pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];
//再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量
nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize);
}
if (ERROR_SUCCESS==nRel)
{
//可能有多网卡,因此通过循环去判断
while (pIpAdapterInfo)
{
AnsiString OneMac = "";
//ShowMessage("网卡名称:" + AnsiString(pIpAdapterInfo->AdapterName));
//ShowMessage("网卡描述:" + AnsiString(pIpAdapterInfo->Description));
for (UINT i = 0; i < pIpAdapterInfo->AddressLength; i++)
{
if (i==pIpAdapterInfo->AddressLength-1)
{
AnsiString s = "";
s.printf("%02x", pIpAdapterInfo->Address[i]);
OneMac += s;
}
else
{
AnsiString s = "";
s.printf("%02x-", pIpAdapterInfo->Address[i]);
OneMac += s;
}
}
//ShowMessage("网卡MAC地址:" + OneMac.UpperCase());
AllMac = AllMac + OneMac.UpperCase() + ",";
//可能网卡有多IP
/*
IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);
do
{
ShowMessage(pIpAddrString->IpAddress.String);
pIpAddrString=pIpAddrString->Next;
} while (pIpAddrString);
*/
pIpAdapterInfo = pIpAdapterInfo->Next;
}
}
//释放内存空间
if (pIpAdapterInfo) {
delete pIpAdapterInfo;
}
getchar();
if(AllMac.Length() > 0) AllMac = AllMac.SubString(1, AllMac.Length() - 1);
return AllMac;
}
------------------------------------------------------------------------------------------------------------------------------------------------------
AnsiString GetAllMac()
{
try{
AnsiString AllMac="";
NCB ncb;
typedef struct _ASTAT_
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff [30];
}ASTAT, * PASTAT;
ASTAT Adapter;
typedef struct _LANA_ENUM
{ // le
UCHAR length;
UCHAR lana[MAX_LANA];
}LANA_ENUM ;
LANA_ENUM lana_enum;
UCHAR uRetCode;
memset(&ncb, 0, sizeof(ncb));
memset(&lana_enum, 0, sizeof(lana_enum));
ncb.ncb_command = NCBENUM;
ncb.ncb_buffer = (unsigned char *)&lana_enum;
ncb.ncb_length = sizeof(LANA_ENUM);
uRetCode = Netbios(&ncb);
if(uRetCode != NRC_GOODRET)
return uRetCode;
for(int lana=0; lana<lana_enum.length; lana++)
{
ncb.ncb_command = NCBRESET;
ncb.ncb_lana_num = lana_enum.lana[lana];
uRetCode = Netbios(&ncb);
if(uRetCode == NRC_GOODRET)
break;
}
if(uRetCode != NRC_GOODRET)
return uRetCode;
memset(&ncb, 0, sizeof(ncb));
ncb.ncb_command = NCBASTAT;
ncb.ncb_lana_num = lana_enum.lana[0];
strcpy((char*)ncb.ncb_callname, "*");
ncb.ncb_buffer = (unsigned char *)&Adapter;
ncb.ncb_length = sizeof(Adapter);
uRetCode = Netbios(&ncb);
if(uRetCode != NRC_GOODRET)
return uRetCode;
AllMac.sprintf("%02X-%02X-%02X-%02X-%02X-%02X",
Adapter.adapt.adapter_address[0],
Adapter.adapt.adapter_address[1],
Adapter.adapt.adapter_address[2],
Adapter.adapt.adapter_address[3],
Adapter.adapt.adapter_address[4],
Adapter.adapt.adapter_address[5]
);
return AllMac;
}catch(...){
return "";
}
}