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地址的结构。具体代码如下:
- //操作系统类型
- enum Win32Type {
- Unknow,
- Win32s,
- Windows9X,
- WinNT3,
- WinNT4orHigher
- };
-
- typedef struct tagASTAT
- {
- ADAPTER_STATUS adapt;
- NAME_BUFFER NameBuff[30];
- } ASTAT, *LPASTAT;
-
- //存储网卡的MAC地址的结构
- typedef struct tagMAC_ADDRESS
- {
- BYTE b1,b2,b3,b4,b5,b6;
- } MAC_ADDRESS, *LPMAC_ADDRESS;
-
- //网卡信息的数据结构,包括记录网卡的厂商及型号,与之绑定的IP地址,网关,
- //DNS序列,子网掩码和物理地址
- typedef struct tagNET_CARD
- {
- TCHAR szDescription[256];
- BYTE szMacAddr[6];
- TCHAR szGateWay[128];
- TCHAR szIpAddress[128];
- TCHAR szIpMask[128];
- TCHAR szDNSNameServer[128];
- } NET_CARD, *LPNET_CARD;
-
- class ClassNetSetting
- {
- public:
- void ProcessMultiString(LPTSTR lpszString, DWORD dwSize);
- UCHAR GetAddressByIndex(int lana_num, ASTAT &Adapter);
- BOOL GetSettingOfWinNT();
- int GetMacAddress(LPMAC_ADDRESS pMacAddr);
- BOOL GetSetting();
- ClassNetSetting();
- virtual ~ClassNetSetting();
- public:
- BOOL GetSettingOfWin9X();
- Win32Type GetSystemType();
- int m_TotalNetCards; //系统的网卡数
- TCHAR m_szDomain[16]; //域名
- TCHAR m_szHostName[16]; //主机名
- int m_IPEnableRouter; //是否允许IP路由: 0-不允许, 1-允许, 2-未知
- int m_EnableDNS; //是否允许DNS解析: 0-不允许, 1-允许, 2-未知
- NET_CARD m_Cards[MAX_CARD]; //默认的最大网卡数是10
- Win32Type m_SystemType; //操作系统类型
- MAC_ADDRESS m_MacAddr[MAX_CARD]; //允许10个网卡
-
- };