本帖最后由 dengchaozhu 于 2012-04-24 21:14:15 编辑

解决方案 »

  1.   

    这个随便百度也有了呀
    http://it.china-b.com/cxsj/vc/20090612/102470_1.html
      

  2.   

    GetAdaptersInfo()
    GetAdaptersAddress();
      

  3.   


    // 个人认为比较简单的方法,如下:
    // 增加头文件:#include "iphlpapi.h"
    // 包含库文件:#pragma comment(lib, "iphlpapi.lib")
    // iphlpapi.lib网上可以下载到
    BOOL GetMacAddress(CString &strMac)
    {
    PIP_ADAPTER_INFO pAdapterInfo;  
    DWORD AdapterInfoSize;  
    TCHAR szMac[32] = {0};  
    DWORD Err;  

    AdapterInfoSize = 0;  
    Err = GetAdaptersInfo(NULL, &AdapterInfoSize);  

    if((Err != 0) && (Err != ERROR_BUFFER_OVERFLOW))
            {  
    TRACE("获得网卡信息失败!");  
    return   FALSE;  
    }  

    //   分配网卡信息内存  
    pAdapterInfo = (PIP_ADAPTER_INFO)GlobalAlloc(GPTR, AdapterInfoSize);  
    if(pAdapterInfo == NULL)
            {  
    TRACE("分配网卡信息内存失败");  
    return   FALSE;  
    }  

    if(GetAdaptersInfo(pAdapterInfo, &AdapterInfoSize) != 0)
            {  
    TRACE(_T("获得网卡信息失败!\n"));  
    GlobalFree(pAdapterInfo);  
    return   FALSE;  
    }  

    strMac.Format(_T("%02X%02X%02X%02X%02X%02X"),    
    pAdapterInfo->Address[0],  
    pAdapterInfo->Address[1],  
    pAdapterInfo->Address[2],  
    pAdapterInfo->Address[3],  
    pAdapterInfo->Address[4],  
    pAdapterInfo->Address[5]);  

    GlobalFree(pAdapterInfo);  
    return   TRUE;  }
      

  4.   

    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;
      

  5.   

    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;
      }
      

  6.   


    #include <string>
    #include <iostream>
    using namespace std;
    //命令行输出缓冲大小
    const long MAX_COMMAND_SIZE = 10000;
    //获取MAC命令行
    char szFetCmd[] = "ipconfig /all";
    //网卡MAC地址的前导信息
    const string str4Search = "Physical Address. . . . . . . . . : ";
    //用命令行方式获取网卡MAC地址
    BOOL GetMacByCmd(char *lpszMac);
    ////////////////////////////////////////////////////////////////////////
    //      1. 创建一个无名管道。
    //      2. 创建一个IPCONFIG 的进程,并将输出重定向到管道。
    //      3. 从管道获取命令行返回的所有信息放入缓冲区lpszBuffer。
    //      4. 从缓冲区lpszBuffer中获得抽取出MAC串。
    //
    //  提示:可以方便的由此程序获得IP地址等其他信息。
    //        对于其他的可以通过其他命令方式得到的信息只需改变strFetCmd 和 
    //        str4Search的内容即可。
    ///////////////////////////////////////////////////////////////////////////
    BOOL GetMacByCmd(char *lpszMac)
    {
        //初始化返回MAC地址缓冲区
         memset(lpszMac, 0x00, sizeof(lpszMac));
        BOOL bret; 
        SECURITY_ATTRIBUTES sa; 
        HANDLE hReadPipe,hWritePipe; 
        sa.nLength = sizeof(SECURITY_ATTRIBUTES); 
        sa.lpSecurityDescriptor = NULL; 
        sa.bInheritHandle = TRUE; 
     
        //创建管道
         bret = CreatePipe(&hReadPipe, &hWritePipe, &sa, 0);
        if(!bret)
        {
            return FALSE;
        }
        //控制命令行窗口信息
        STARTUPINFO si; 
        //返回进程信息
        PROCESS_INFORMATION pi; 
        si.cb = sizeof(STARTUPINFO); 
        GetStartupInfo(&si); 
        si.hStdError = hWritePipe; 
        si.hStdOutput = hWritePipe; 
        si.wShowWindow = SW_HIDE; //隐藏命令行窗口
        si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
        //创建获取命令行进程
         bret = CreateProcess (NULL, szFetCmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi ); 
     
     char szBuffer[MAX_COMMAND_SIZE+1]; //放置命令行输出缓冲区
     string strBuffer;
     if (bret) 
     { 
      WaitForSingleObject (pi.hProcess, INFINITE); 
      unsigned long count;
      CloseHandle(hWritePipe);
      memset(szBuffer, 0x00, sizeof(szBuffer));
      bret  =  ReadFile(hReadPipe,  szBuffer,  MAX_COMMAND_SIZE,  &count,  0);
      if(!bret)
      {
       //关闭所有的句柄
       CloseHandle(hWritePipe);
       CloseHandle(pi.hProcess); 
       CloseHandle(pi.hThread); 
       CloseHandle(hReadPipe);
       return FALSE;
      }
      else
      {
       strBuffer = szBuffer;
       long ipos;
       ipos = strBuffer.find(str4Search);
       //提取MAC地址串
       strBuffer = strBuffer.substr(ipos+str4Search.length());
       ipos = strBuffer.find("\n");
       strBuffer = strBuffer.substr(0, ipos);
      }
      
     }
     memset(szBuffer, 0x00, sizeof(szBuffer));
     strcpy(szBuffer, strBuffer.c_str());
     //去掉中间的“00-50-EB-0F-27-82”中间的'-'得到0050EB0F2782
     int j = 0;
     for(int i=0; i<strlen(szBuffer); i++)
     {
      if(szBuffer[i] != '-')
      {
       lpszMac[j] = szBuffer[i];
       j++;
      }
     }
        //关闭所有的句柄
         CloseHandle(hWritePipe);
        CloseHandle(pi.hProcess); 
        CloseHandle(pi.hThread); 
        CloseHandle(hReadPipe);
        return TRUE;
    }
      

  7.   

    3楼的方法可以尝试在project->Setting里添加库文件“iphlpapi.lib”
      

  8.   

    多谢各位
    /////////
    ipconfig.exe 又是调用了什么函数呢
      

  9.   

    适用枚举系统注册键,然后读设备判断
    可以获得当前正在工作的网卡的物理地址
    其它方法,都可能获得一个虚拟的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;
    }
      

  10.   

    你就是想研究ipconfig
    看看这个,这面说微软有示例代码
    http://topic.csdn.net/u/20080717/11/540ea3fc-c584-46c2-82ee-4c64f277a343.html
      

  11.   

    你就是想研究ipconfig
    看看这个,这面说微软有示例代码
    http://topic.csdn.net/u/20080717/11/540ea3fc-c584-46c2-82ee-4c64f277a343.html
      

  12.   

    IPHELPER api
    GetAdaptersInfo()