在正常情况下:取的mac地址是通过注册表的HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VxD\MSTCP子键和
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Class\Net子键下的值,是吧?
    我的机器上原来没有NetBEUI协议,于是我在“网络邻居->属性”中添加了这个协议,重启计算机之后,HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VxD\MSTCP子键下只有Hostname一项,而HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Class子键更本不存在,这是为什么?

解决方案 »

  1.   

    max地址是硬件的属性,NetBEUI读取网卡获取mac地址,何必要靠注册表?
      

  2.   

    你很熟悉NetBEUI的内部工作的情况吗?你确定NetBEUI安装后一定会在注册表中加入你所说的吗?我的意思是注册表是保存数据的地方,仅此而已,是否使用注册表这要根据程序开发者的意途,没有强硬非要使用的规定,就算使用也没有非要在安装时使用的规定。如果硬要一个回答的话,我可以假设NetBEUI是在第一次调用读取mac地址时才建立HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Class键,所以你安装好后一开始是看不到这个键的,当然这只是假设。要知道UNIX中根本没有注册表概念,难到UNIX就无法知道网卡的mac地址了吗?另外关于怎么读取mac地址,你可以使用NETBIOS函数读取,决对不要从注册表中获取,因为很可能下一个windows操作系统就不使用该键了。
      

  3.   

    #include <windows.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <iostream>
    #include <string>using namespace std;
    #define bzero(thing,sz) memset(thing,0,sz)bool getadapterinfo(int adapter_num, string &mac_addr)
    {
      // 重置网卡,以便我们可以查询
      ncb ncb;
      memset(&ncb, 0, sizeof(ncb));
      ncb.ncb_command = ncbreset;
      ncb.ncb_lana_num = adapter_num;
      if (netbios(&ncb) != nrc_goodret) {
        mac_addr = "bad (ncbreset): ";
        mac_addr += string(ncb.ncb_retcode);
        return false;
      }  // 准备取得接口卡的状态块
      bzero(&ncb,sizeof(ncb);
      ncb.ncb_command = ncbastat;
      ncb.ncb_lana_num = adapter_num;
      strcpy((char *) ncb.ncb_callname, "*");
      struct astat
      {
        adapter_status adapt;
        name_buffer namebuff[30];
      } adapter;
      bzero(&adapter,sizeof(adapter));
      ncb.ncb_buffer = (unsigned char *)&adapter;
      ncb.ncb_length = sizeof(adapter);  // 取得网卡的信息,并且如果网卡正常工作的话,返回标准的冒号分隔格式。
      if (netbios(&ncb) == 0)
      {
        char acmac[18];
        sprintf(acmac, "%02x:%02x:%02x:%02x:%02x:%02x",
                int (adapter.adapt.adapter_address[0]),
                int (adapter.adapt.adapter_address[1]),
                int (adapter.adapt.adapter_address[2]),
                int (adapter.adapt.adapter_address[3]),
                int (adapter.adapt.adapter_address[4]),
                int (adapter.adapt.adapter_address[5]));
        mac_addr = acmac;
        return true;
      }
      else
      {
        mac_addr = "bad (ncbastat): ";
        mac_addr += string(ncb.ncb_retcode);
        return false;
      }
    }int main()
    {
      // 取得网卡列表
      lana_enum adapterlist;
      ncb ncb;
      memset(&ncb, 0, sizeof(ncb));
      ncb.ncb_command = ncbenum;
      ncb.ncb_buffer = (unsigned char *)&adapterlist;
      ncb.ncb_length = sizeof(adapterlist);
      netbios(&ncb);  // 取得本地以太网卡的地址
      string mac_addr;
      for (int i = 0; i < adapterlist.length - 1; ++i)
      {
        if (getadapterinfo(adapterlist.lana[i], mac_addr))
        {
          cout << "adapter " << int (adapterlist.lana[i]) <<
                  "'s mac is " << mac_addr << endl;
        }
        else
        {
          cerr << "failed to get mac address! do you" << endl;
          cerr << "have the netbios protocol installed?" << endl;
          break;
        }
      }  return 0;
    }