1.1.4 小试牛刀--编程实现获取MAC地址(1)

1.1.4  小试牛刀--编程实现获取MAC地址(1)

实例功能 使用Visual C++开发一个FTP传输系统

源码路径 光盘\yuanma\1\FTP

本实例的目的是,使用Visual C++ 6.0开发一个获取当前机器MAC地址的程序。

1. 选择开发工具

Visual C++是一个功能强大的可视化软件开发工具。自1993年Microsoft公司推出Visual C++ 1.0以来,不断有其新版本问世,随后微软又推出了.NET系列,添加了很多网络功能,但是它的应用有一定的局限性。Visual C++已成为专业程序员进行软件开发的首选工具,其中,Visual C++ 6.0是其中比较成熟的一个版本,也是最常用的一个版本。

2. 设计MFC窗体

使用Visual C++ 6.0创建一个MFC项目后,根据本实例的需要,我们设计3个窗体,它们分别是IDD_ABOUTBOX(见图1-6)、IDD_GETNETSETTING_DIALOG(见图1-7)和IDD_CARDINFO(见图1-8)。

 
图1-6  IDD_ABOUTBOX窗体
 
图1-7  IDD_GETNETSETTING_DIALOG窗体
 
图1-8  IDD_CARDINFO窗体

3. 具体编码

设计好窗体之后,接下来开始讲解具体的编码过程。

(1) 在文件ClassNetSetting.h中,定义类ClassNetSetting,根据不同的操作系统获取存储网卡的MAC地址的结构。具体代码如下:

  1. //操作系统类型
  2. enum Win32Type {
  3. Unknow,
  4. Win32s,
  5. Windows9X,
  6. WinNT3,
  7. WinNT4orHigher
  8. };
  9. typedef struct tagASTAT
  10. {
  11. ADAPTER_STATUS adapt;
  12. NAME_BUFFER  NameBuff[30];
  13. } ASTAT, *LPASTAT;
  14. //存储网卡的MAC地址的结构
  15. typedef struct tagMAC_ADDRESS
  16. {
  17. BYTE b1,b2,b3,b4,b5,b6;
  18. } MAC_ADDRESS, *LPMAC_ADDRESS;
  19. //网卡信息的数据结构,包括记录网卡的厂商及型号,与之绑定的IP地址,网关,
  20. //DNS序列,子网掩码和物理地址
  21. typedef struct tagNET_CARD
  22. {
  23. TCHAR szDescription[256];
  24. BYTE  szMacAddr[6];
  25. TCHAR szGateWay[128];
  26. TCHAR szIpAddress[128];
  27. TCHAR szIpMask[128];
  28. TCHAR szDNSNameServer[128];
  29. } NET_CARD, *LPNET_CARD;
  30. class ClassNetSetting
  31. {
  32. public:
  33. void ProcessMultiString(LPTSTR lpszString, DWORD dwSize);
  34. UCHAR GetAddressByIndex(int lana_num, ASTAT &Adapter);
  35. BOOL GetSettingOfWinNT();
  36. int GetMacAddress(LPMAC_ADDRESS pMacAddr);
  37. BOOL GetSetting();
  38. ClassNetSetting();
  39. virtual ~ClassNetSetting();
  40. public:
  41. BOOL GetSettingOfWin9X();
  42. Win32Type GetSystemType();
  43. int         m_TotalNetCards; //系统的网卡数
  44. TCHAR       m_szDomain[16]; //域名
  45. TCHAR       m_szHostName[16]; //主机名
  46. int         m_IPEnableRouter; //是否允许IP路由: 0-不允许, 1-允许, 2-未知
  47. int         m_EnableDNS; //是否允许DNS解析: 0-不允许, 1-允许, 2-未知
  48. NET_CARD        m_Cards[MAX_CARD]; //默认的最大网卡数是10
  49. Win32Type       m_SystemType; //操作系统类型
  50. MAC_ADDRESS     m_MacAddr[MAX_CARD]; //允许10个网卡
  51. };

(2) 编写文件ClassNetSetting.cpp,用于向网卡发送信息,以获取当前计算机的网卡数目和名称。具体代码如下:

  1. ClassNetSetting::ClassNetSetting()
  2. {
  3. m_TotalNetCards = 0;
  4. _tcscpy(m_szDomain,_T(""));
  5. _tcscpy(m_szHostName,_T(""));
  6. m_IPEnableRouter = 2;
  7. m_EnableDNS = 2;
  8. m_SystemType = Unknow;
  9. }
  10. ClassNetSetting::~ClassNetSetting()
  11. {
  12. }
  13. BOOL ClassNetSetting::GetSetting()
  14. {
  15. m_SystemType = GetSystemType();
  16. if (m_SystemType == Windows9X)
  17. return GetSettingOfWin9X();
  18. else if(m_SystemType == WinNT4orHigher)
  19. return GetSettingOfWinNT();
  20. else //不支持老旧的操作系统
  21. return FALSE;
  22. }
  23. Win32Type ClassNetSetting::GetSystemType()
  24. {
  25. Win32Type  SystemType;
  26. DWORD winVer;
  27. OSVERSIONINFO *osvi;
  28. winVer = GetVersion();
  29. if(winVer < 0x80000000)
  30. {
  31. /*NT */
  32. SystemType = WinNT3;
  33. osvi = (OSVERSIONINFO*)malloc(sizeof(OSVERSIONINFO));
  34. if (osvi != NULL)
  35. {
  36. memset(osvi, 0, sizeof(OSVERSIONINFO));
  37. osvi->dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  38. GetVersionEx(osvi);
  39. if (osvi->dwMajorVersion >= 4L)
  40. SystemType = WinNT4orHigher; //它是NT4或更高版本!
  41. free(osvi);
  42. }
  43. }
  44. else if (LOBYTE(LOWORD(winVer)) < 4)
  45. SystemType = Win32s; /*Win32s*/
  46. else
  47. SystemType = Windows9X; /*Windows9X*/
  48. return SystemType;
  49. }
  50. BOOL ClassNetSetting::GetSettingOfWin9X()
  51. {
  52. LONG lRet;
  53. HKEY hMainKey;
  54. TCHAR szNameServer[256];
  55. //得到域名,网关和DNS的设置
  56. lRet = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,
  57. _T("System\\CurrentControlSet\\Services\\VxD\\MSTCP"),
  58. 0, KEY_READ, &hMainKey);
  59. if(lRet == ERROR_SUCCESS)
  60. {
  61. DWORD dwType, dwDataSize=256;
  62. ::RegQueryValueEx(hMainKey, _T("Domain"), NULL, &dwType,
  63. (LPBYTE)m_szDomain, &dwDataSize);
  64. dwDataSize = 256;
  65. ::RegQueryValueEx(hMainKey, _T("Hostname"), NULL, &dwType,
  66. (LPBYTE)m_szHostName, &dwDataSize);
  67. dwDataSize = 256;
  68. ::RegQueryValueEx(hMainKey, _T("EnableDNS"), NULL, &dwType,
  69. (LPBYTE)&m_EnableDNS, &dwDataSize);
  70. dwDataSize = 256;
  71. ::RegQueryValueEx(hMainKey, _T("NameServer"), NULL, &dwType,
  72. (LPBYTE)szNameServer, &dwDataSize);
  73. }
  74. ::RegCloseKey(hMainKey);
  75. HKEY hNetCard = NULL;
  76. //调用CTcpCfg类的静态函数得到网卡的数目和相应的MAC地址
  77. m_TotalNetCards = GetMacAddress(m_MacAddr);
  78. lRet = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,
  79. _T("System\\CurrentControlSet\\Services\\Class\\Net"),
  80. 0, KEY_READ, &hNetCard);
  81. if(lRet != ERROR_SUCCESS) //此处失败就返回
  82. {
  83. if(hNetCard != NULL)
  84. ::RegCloseKey(hNetCard);
  85. return FALSE;
  86. }
  87. DWORD dwSubKeyNum = 0,dwSubKeyLen = 256;
  88. //得到子键的个数,通常与网卡个数相等
  89. lRet = ::RegQueryInfoKey(hNetCard, NULL, NULL, NULL,
  90. &dwSubKeyNum, &dwSubKeyLen, NULL,NULL,NULL,NULL,NULL,NULL);
  91. if(lRet == ERROR_SUCCESS)
  92. {
  93. //m_TotalNetCards = dwSubKeyNum; //网卡个数以此为主
  94. LPTSTR lpszKeyName = new TCHAR[dwSubKeyLen + 1];
  95. DWORD dwSize;
  96. for(int i=0; i<(int)m_TotalNetCards; i++)
  97. {
  98. TCHAR szNewKey[256];
  99. HKEY hNewKey;
  100. DWORD dwType=REG_SZ, dwDataSize=256;
  101. dwSize = dwSubKeyLen + 1;
  102. lRet = ::RegEnumKeyEx(hNetCard, i, lpszKeyName,
  103. &dwSize, NULL, NULL, NULL, NULL);
  104. if(lRet == ERROR_SUCCESS)
  105. {
  106. lRet = ::RegOpenKeyEx(hNetCard,
  107. lpszKeyName, 0, KEY_READ, &hNewKey);
  108. if(lRet == ERROR_SUCCESS)
  109. ::RegQueryValueEx(hNewKey, _T("DriverDesc"), NULL,
  110. &dwType, (LPBYTE)m_Cards[i].szDescription, &dwDataSize);
  111. ::RegCloseKey(hNewKey);
  112. wsprintf(szNewKey,
  113. _T("System\\CurrentControlSet\\Services\\Class\\NetTrans\\%s"),
  114. lpszKeyName);
  115. lRet = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,
  116. szNewKey, 0, KEY_READ, &hNewKey);
  117. if(lRet == ERROR_SUCCESS)
  118. {
  119. dwDataSize = 256;
  120. ::RegQueryValueEx(hNewKey, _T("DefaultGateway"), NULL,
  121. &dwType, (LPBYTE)m_Cards[i].szGateWay, &dwDataSize);
  122. ProcessMultiString(m_Cards[i].szGateWay, dwDataSize);
  123. dwDataSize = 256;

1.1.4  小试牛刀--编程实现获取MAC地址(3)

  1. ::RegQueryValueEx(hNewKey,_T("IPAddress"), NULL,
  2. &dwType, (LPBYTE)m_Cards[i].szIpAddress, &dwDataSize);
  3. ProcessMultiString(m_Cards[i].szIpAddress, dwDataSize);
  4. dwDataSize = 256;
  5. ::RegQueryValueEx(hNewKey, _T("IPMask"), NULL, &dwType,
  6. (LPBYTE)m_Cards[i].szIpMask, &dwDataSize);
  7. ProcessMultiString(m_Cards[i].szIpMask, dwDataSize);
  8. //拷贝前面得到的DNS主机名
  9. _tcscpy(m_Cards[i].szDNSNameServer, szNameServer);
  10. }
  11. ::RegCloseKey(hNewKey);
  12. }
  13. m_Cards[i].szMacAddr[0] = m_MacAddr[i].b1;
  14. m_Cards[i].szMacAddr[1] = m_MacAddr[i].b2;
  15. m_Cards[i].szMacAddr[2] = m_MacAddr[i].b3;
  16. m_Cards[i].szMacAddr[3] = m_MacAddr[i].b4;
  17. m_Cards[i].szMacAddr[4] = m_MacAddr[i].b5;
  18. m_Cards[i].szMacAddr[5] = m_MacAddr[i].b6;
  19. }
  20. }
  21. ::RegCloseKey(hNetCard);
  22. return lRet == ERROR_SUCCESS ? TRUE : FALSE;
  23. }
  24. int ClassNetSetting::GetMacAddress(LPMAC_ADDRESS pMacAddr)
  25. {
  26. NCB ncb;
  27. UCHAR uRetCode;
  28. int num = 0;
  29. LANA_ENUM lana_enum;
  30. memset(&ncb, 0, sizeof(ncb));
  31. ncb.ncb_command = NCBENUM;
  32. ncb.ncb_buffer = (unsigned char *)&lana_enum;
  33. ncb.ncb_length = sizeof(lana_enum);
  34. //向网卡发送NCBENUM命令,以获取当前机器的网卡信息,如有多少个网卡,
  35. //每张网卡的编号等
  36. uRetCode = Netbios(&ncb);
  37. if (uRetCode == 0)
  38. {
  39. num = lana_enum.length;
  40. //对每一张网卡,以其网卡编号为输入编号,获取其MAC地址
  41. for (int i=0; i<num; i++)
  42. {
  43. ASTAT Adapter;
  44. if(GetAddressByIndex(lana_enum.lana[i],Adapter) == 0)
  45. {
  46. pMacAddr[i].b1 = Adapter.adapt.adapter_address[0];
  47. pMacAddr[i].b2 = Adapter.adapt.adapter_address[1];
  48. pMacAddr[i].b3 = Adapter.adapt.adapter_address[2];
  49. pMacAddr[i].b4 = Adapter.adapt.adapter_address[3];
  50. pMacAddr[i].b5 = Adapter.adapt.adapter_address[4];
  51. pMacAddr[i].b6 = Adapter.adapt.adapter_address[5];
  52. }
  53. }
  54. }
  55. return num;
  56. }
  57. BOOL ClassNetSetting::GetSettingOfWinNT()
  58. {
  59. LONG lRtn;
  60. HKEY hMainKey;
  61. TCHAR szParameters[256];
  62. //获得域名,主机名和是否使用IP路由
  63. _tcscpy(szParameters,
  64. _T("SYSTEM\\ControlSet001\\Services\\Tcpip\\Parameters"));
  65. lRtn = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,
  66. szParameters, 0, KEY_READ, &hMainKey);
  67. if(lRtn == ERROR_SUCCESS)
  68. {
  69. DWORD dwType,dwDataSize = 256;
  70. ::RegQueryValueEx(hMainKey, _T("Domain"), NULL, &dwType,
  71. (LPBYTE)m_szDomain, &dwDataSize);
  72. dwDataSize = 256;
  73. ::RegQueryValueEx(hMainKey, _T("Hostname"), NULL, &dwType,
  74. (LPBYTE)m_szHostName, &dwDataSize);
  75. dwDataSize = 256;
  76. ::RegQueryValueEx(hMainKey, _T("IPEnableRouter"), NULL, &dwType,
  77. (LPBYTE)&m_IPEnableRouter, &dwDataSize);
  78. }
  79. ::RegCloseKey(hMainKey);
  80. //获得IP地址和DNS解析等其他设置
  81. HKEY hNetCard = NULL;
  82. m_TotalNetCards = GetMacAddress(m_MacAddr);
  83. lRtn = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,
  84. _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards"),
  85. 0, KEY_READ, &hNetCard);
  86. if(lRtn != ERROR_SUCCESS) //此处失败就返回
  87. {
  88. if(hNetCard != NULL)
  89. ::RegCloseKey(hNetCard);
  90. return FALSE;
  91. }
  92. DWORD dwSubKeyNum=0, dwSubKeyLen=256;
  93. //得到子键的个数,通常与网卡个数相等
  94. lRtn = ::RegQueryInfoKey(hNetCard, NULL, NULL, NULL,
  95. &dwSubKeyNum, &dwSubKeyLen, NULL,NULL,NULL,NULL,NULL,NULL);
  96. if(lRtn == ERROR_SUCCESS)
  97. {
  98. m_TotalNetCards = dwSubKeyNum; //网卡个数以此为主
  99. LPTSTR lpszKeyName = new TCHAR[dwSubKeyLen + 1];
  100. DWORD dwSize;
  101. for(int i=0; i<(int)dwSubKeyNum; i++)
  102. {
  103. TCHAR szServiceName[256];

1.1.4  小试牛刀--编程实现获取MAC地址(4)

  1. HKEY hNewKey;
  2. DWORD dwType = REG_SZ,dwDataSize = 256;
  3. dwSize = dwSubKeyLen + 1;
  4. ::RegEnumKeyEx(hNetCard, i, lpszKeyName,
  5. &dwSize, NULL,NULL,NULL,NULL);
  6. lRtn = ::RegOpenKeyEx(hNetCard,lpszKeyName,0,KEY_READ,&hNewKey);
  7. if(lRtn == ERROR_SUCCESS)
  8. {
  9. lRtn = ::RegQueryValueEx(hNewKey, _T("Description"), NULL,
  10. &dwType, (LPBYTE)m_Cards[i].szDescription, &dwDataSize);
  11. dwDataSize = 256;
  12. lRtn = ::RegQueryValueEx(hNewKey, _T("ServiceName"), NULL,
  13. &dwType, (LPBYTE)szServiceName, &dwDataSize);
  14. if(lRtn == ERROR_SUCCESS)
  15. {
  16. TCHAR szNewKey[256];
  17. wsprintf(szNewKey, _T("%s\\Interfaces\\%s"),
  18. szParameters, szServiceName);
  19. HKEY hTcpKey;
  20. lRtn = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, szNewKey, 0,
  21. KEY_READ, &hTcpKey);
  22. if(lRtn == ERROR_SUCCESS)
  23. {
  24. dwDataSize = 256;
  25. ::RegQueryValueEx(hTcpKey, _T("DefaultGateway"), NULL,
  26. &dwType, (LPBYTE)m_Cards[i].szGateWay, &dwDataSize);
  27. ProcessMultiString(m_Cards[i].szGateWay, dwDataSize);
  28. dwDataSize = 256;
  29. ::RegQueryValueEx(hTcpKey, _T("IPAddress"), NULL,
  30. &dwType,(LPBYTE)m_Cards[i].szIpAddress,&dwDataSize);
  31. ProcessMultiString(m_Cards[i].szIpAddress,dwDataSize);
  32. dwDataSize = 256;
  33. ::RegQueryValueEx(hTcpKey, _T("SubnetMask"), NULL,
  34. &dwType, (LPBYTE)m_Cards[i].szIpMask, &dwDataSize);
  35. ProcessMultiString(m_Cards[i].szIpMask, dwDataSize);
  36. dwDataSize = 256;
  37. ::RegQueryValueEx(hTcpKey, _T("NameServer"), NULL,
  38. &dwType, (LPBYTE)m_Cards[i].szDNSNameServer,
  39. &dwDataSize);
  40. }
  41. ::RegCloseKey(hTcpKey);
  42. }
  43. }
  44. ::RegCloseKey(hNewKey);
  45. m_Cards[i].szMacAddr[0] = m_MacAddr[i].b1;
  46. m_Cards[i].szMacAddr[1] = m_MacAddr[i].b2;
  47. m_Cards[i].szMacAddr[2] = m_MacAddr[i].b3;
  48. m_Cards[i].szMacAddr[3] = m_MacAddr[i].b4;
  49. m_Cards[i].szMacAddr[4] = m_MacAddr[i].b5;
  50. m_Cards[i].szMacAddr[5] = m_MacAddr[i].b6;
  51. }
  52. delete []lpszKeyName;
  53. }
  54. ::RegCloseKey(hNetCard);
  55. return lRtn == ERROR_SUCCESS ? TRUE : FALSE;
  56. }
  57. UCHAR ClassNetSetting::GetAddressByIndex(int lana_num, ASTAT &Adapter)
  58. {
  59. NCB ncb;
  60. UCHAR uRetCode;
  61. memset(&ncb, 0, sizeof(ncb));
  62. ncb.ncb_command = NCBRESET;
  63. ncb.ncb_lana_num = lana_num;
  64. //指定网卡号,首先对选定的网卡发送一个NCBRESET命令,以便进行初始化
  65. uRetCode = Netbios(&ncb);
  66. memset(&ncb, 0, sizeof(ncb));
  67. ncb.ncb_command = NCBASTAT;
  68. ncb.ncb_lana_num = lana_num;   //指定网卡号
  69. strcpy((char*)ncb.ncb_callname, "*      " );
  70. ncb.ncb_buffer = (unsigned char *)&Adapter;
  71. //指定返回信息存放的变量
  72. ncb.ncb_length = sizeof(Adapter);
  73. //接着,可以发送NCBASTAT命令以获取网卡的信息
  74. uRetCode = Netbios(&ncb);
  75. return uRetCode;
  76. }
  77. void ClassNetSetting::ProcessMultiString(LPTSTR lpszString, DWORD dwSize)
  78. {
  79. for(int i=0; i<int(dwSize-2); i++)
  80. {
  81. if(lpszString[i] == _T(‘\0‘))
  82. lpszString[i] = _T(‘,‘);
  83. }
  84. }

到此为止,本实例的主要代码讲解完毕。执行后将首先显示网卡的类型,如图1-9所示。单击"确定"按钮,在弹出的窗体中可以查看此网卡的MAC地址,如图1-10所示。

 
图1-9  获取网卡的类型
 
图1-10  网卡详情
时间: 2024-10-10 23:17:13

1.1.4 小试牛刀--编程实现获取MAC地址(1)的相关文章

小试牛刀--编程实现获取计算机的IP地址和计算机名

1.2.3  小试牛刀--编程实现获取计算机的IP地址和计算机名(1) 实例功能 获取当前计算机的IP地址和计算机名 源码路径 光盘\yuanma\1\IP 本实例的目的是,使用Visual C++ 6.0开发一个获取当前机器的IP地址和计算机名的应用程序. 1. 设计MFC窗体 使用Visual C++ 6.0创建一个MFC项目后,根据本实例的需要设计两个窗体,分别是IDD_ABOUTBOX窗体(见图1-12)和IDD_IPADDRESS_DIALOG窗体(见图1-13).   图1-12 

C#获取MAC地址

/// <summary> /// 获取MAC地址(返回第一个物理以太网卡的mac地址) /// </summary> /// <returns>成功返回mac地址,失败返回null</returns> public string getMacAddress() { string macAddress = null; try { NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterface

Python windows下获取MAC地址的一种方法

我最近有一个项目,使用Python在win32下开发一个COM组建,该COM组建其中一个方法是获取本地电脑的MAC地址. 需求很简单,虽然我是Python新手中的新手,但我还是会使用搜索引擎进行搜索. 百度一下,发现大部分都介绍使用import UUID获取MAC地址,或使用os.popen("ipconfig /all")的方式获取.而后者容易受到操作系统中英文环境影响. 如这篇文章:http://www.cnblogs.com/Jerryshome/archive/2011/11/

android 获取MAC地址

由于WiFi 的Mac address 是一个被动咨询.一般在开机后,不会主动上到的系统里.要等待WiFi硬件启动后,才会把有关Mac address资料记载入系统去. 所以一般android系统获取Mac address时候会出现以下几种情况: 1.在WiFi打开的时候可以获取到Mac地址 2.关闭WiFi,不重启系统,也可以获取到Mac address 3.系统重启后,不打开WiFi,获取不到Mac address 4.系统重启后,不开开WiFi,打开2G.3G网络,获取不到Mac addr

android获取Mac地址和IP地址

获取Mac地址实际项目中测试了如下几种方法:(1)设备开通Wifi连接,获取到网卡的MAC地址(但是不开通wifi,这种方法获取不到Mac地址,这种方法也是网络上使用的最多的方法) //根据Wifi信息获取本地Mac public static String getLocalMacAddressFromWifiInfo(Context context){ WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_

C#获取MAC地址的几种方法

首先需要用到的一些方法和类: public enum NCBCONST { NCBNAMSZ = 16, MAX_LANA = 254, NCBENUM = 0x37, NRC_GOODRET = 0x00, NCBRESET = 0x32, NCBASTAT = 0x33, NUM_NAMEBUF = 30, } [StructLayout(LayoutKind.Sequential)] public struct ADAPTER_STATUS { [MarshalAs(UnmanagedTy

【转载】获取MAC地址方法大全

From:http://blog.csdn.net/han2814675/article/details/6223617 Windows平台下用C++代码取得机器的MAC地址并不是一件简单直接的事情.到目前为止,作者尚未发现有任何一个通用的100%的适用于所有Windows平台的方法可以稳定的取得MAC地址.而有些应用(比如MMORPG)则需要稳定的得到机器的MAC地址,解决方案往往是通过多种方法依次使用来提高成功率. 说明: 以下方法只会返回多网卡的第一个MAC地址. 网上有很多文章和源码来解

C# 获取mac地址 本机或者 远程的

/// 获取本机网卡mac地址代码 /// </summary> /// <returns></returns> /// /// <summary> public string GetNetworkAdpaterID() { try { string mac = ""; System.Management.ManagementClass mc = new System.Management.ManagementClass("Wi

Delphi 获取MAC 地址

function GetMacAddress(index:integer):string;var   ncb : TNCB;                {NetBios控制块}   AdapterS : TAdapterStatus; {网卡状态结构}   LanaNum : TLanaeNum;       {Netbios Lana}   i : integer;   rc : Char;                 {NetBios的返回代码}   str : String;beg