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

2013-10-07 15:51:47 · 作者: · 浏览: 90

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

实例功能 使用Visual C++(www.cppentry.com)开发一个FTP传输系统

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

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

1. 选择开发工具

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

2. 设计MFC窗体

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