首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

VC++ 获取本机MAC有几种办法?解决方法

2012-04-30 
VC++ 获取本机MAC有几种办法?如题哪位给几种办法好的再加100分[解决办法]这个随便百度也有了呀http://it.c

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映射)

如下代码供参考:

C/C++ code
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;}
[解决办法]
探讨
引用:
C/C++ code


#include <string>
#include <iostream>
using namespace std;
//命令行输出缓冲大小
const long MAX_COMMAND_SIZE = 10000;
//获取MAC命令行
char szFetCmd[] = "ipconfig /all";
//网卡MAC地址的……

[解决办法]
IPHELPER api
GetAdaptersInfo()

热点排行