VC++ 获取本机MAC有几种办法?
如题
哪位给几种办法
好的再加100分
[解决办法]
这个随便百度也有了呀
http://it.china-b.com/cxsj/vc/20090612/102470_1.html
[解决办法]
GetAdaptersInfo()
GetAdaptersAddress();
[解决办法]
4种方法用VC获取本机MAC地址
1)注意:必须在project->Setting里添加库文件“netapi32.lib”
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <httpext.h>
#include <windef.h>
#include <Nb30.h>
int getMAC(char * mac)
{
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&l
2)t;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;
sprintf(mac,"%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 0;
}
int main(int argc, char* argv[])
{
char mac[200];
getMAC(mac);
printf(" mac : %s \n",mac);
return 0;
}
3)注意:必须在project->Setting里添加库文件“netapi32.lib”。
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <httpext.h>
#include <windef.h>
#include <Nb30.h>
int getMAC(char * mac)
{
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;
[解决办法]
4)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;
sprintf(mac,"%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 0;
}
int main(int argc, char* argv[])
{
char mac[200];
getMAC(mac);
printf(" mac : %s \n",mac);
return 0;
}
[解决办法]
3楼的方法可以尝试在project->Setting里添加库文件“iphlpapi.lib”
[解决办法]
适用枚举系统注册键,然后读设备判断
可以获得当前正在工作的网卡的物理地址
其它方法,都可能获得一个虚拟的MAC(假的MAC映射)
如下代码供参考:
int GetMACreg(BYTE *an){ CMyRegKey regKey; TCHAR sz[256]; CString strClassID(_T("")); TCHAR szSubKey[256]={0}; int iRet = -1; DWORD dwIndex=0; _tcscpy(sz,_T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards")); if(regKey.RegOpen(HKEY_LOCAL_MACHINE,sz,TRUE) == ERROR_SUCCESS) { while(TRUE) { if(regKey.EnumSubKey(dwIndex,szSubKey,255) != ERROR_SUCCESS) { dwIndex++; break; } dwIndex++; if(_tcslen(szSubKey) <= 0) break; CMyRegKey regSub; _stprintf( sz, _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards\\%s"), szSubKey); if(regSub.RegOpen(HKEY_LOCAL_MACHINE,sz,TRUE) != ERROR_SUCCESS) break; strClassID = _T(""); if(regSub.RegRead(_T("ServiceName"),strClassID) != ERROR_SUCCESS) { regSub.RegClose(); continue; } regSub.RegClose(); if(strClassID.GetLength() < 10) continue; //_stprintf(sz,_T("%d\r\n%s\r\n%s"),dwIndex,szSubKey,strClassID); //AfxMessageBox(sz); HANDLE hHandle; hHandle=CreateFile( _T("//./")+strClassID, FILE_SHARE_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,//CREATE_ALWAYS, 0 , NULL); if(hHandle == INVALID_HANDLE_VALUE) continue ; DWORD dw=0; int iBuf = 0x01010101; BYTE outBuf[256]={0}; TCHAR zz[32]={0}; if(DeviceIoControl(hHandle, 0x00170002, &iBuf,4, outBuf,256, &dw, NULL)) { //AfxMessageBox("ok--"); memcpy(an,outBuf,6); iRet = 6; break; } CloseHandle(hHandle); } } if(dwIndex > 0) regKey.RegClose(); return iRet;}
[解决办法]