bcb mac地址

获取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 "";
  }


}


 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值