1.1.4 小试牛刀--编程(www.cppentry.com)实现获取MAC地址(2)
(2) 编写文件ClassNetSetting.cpp,用于向网卡发送信息,以获取当前计算机的网卡数目和名称。具体代码如下:
- ClassNetSetting::ClassNetSetting()
- {
- m_TotalNetCards = 0;
- _tcscpy(m_szDomain,_T(""));
- _tcscpy(m_szHostName,_T(""));
- m_IPEnableRouter = 2;
- m_EnableDNS = 2;
- m_SystemType = Unknow;
- }
-
- ClassNetSetting::~ClassNetSetting()
- {
- }
-
- BOOL ClassNetSetting::GetSetting()
- {
- m_SystemType = GetSystemType();
- if (m_SystemType == Windows9X)
- return GetSettingOfWin9X();
- else if(m_SystemType == WinNT4orHigher)
- return GetSettingOfWinNT();
- else //不支持老旧的操作系统
- return FALSE;
- }
-
- Win32Type ClassNetSetting::GetSystemType()
- {
- Win32Type SystemType;
- DWORD winVer;
- OSVERSIONINFO *osvi;
- winVer = GetVersion();
- if(winVer < 0x80000000)
- {
- /*NT */
- SystemType = WinNT3;
- osvi = (OSVERSIONINFO*)malloc(sizeof(OSVERSIONINFO));
- if (osvi != NULL)
- {
- memset(osvi, 0, sizeof(OSVERSIONINFO));
- osvi->dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
- GetVersionEx(osvi);
- if (osvi->dwMajorVersion >= 4L)
- SystemType = WinNT4orHigher; //它是NT4或更高版本!
- free(osvi);
- }
- }
- else if (LOBYTE(LOWORD(winVer)) < 4)
- SystemType = Win32s; /*Win32s*/
- else
- SystemType = Windows9X; /*Windows9X*/
- return SystemType;
- }
- BOOL ClassNetSetting::GetSettingOfWin9X()
- {
- LONG lRet;
- HKEY hMainKey;
- TCHAR szNameServer[256];
-
- //得到域名,网关和DNS的设置
- lRet = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,
- _T("System\\CurrentControlSet\\Services\\VxD\\MSTCP"),
- 0, KEY_READ, &hMainKey);
- if(lRet == ERROR_SUCCESS)
- {
- DWORD dwType, dwDataSize=256;
- ::RegQueryValueEx(hMainKey, _T("Domain"), NULL, &dwType,
- (LPBYTE)m_szDomain, &dwDataSize);
- dwDataSize = 256;
- ::RegQueryValueEx(hMainKey, _T("Hostname"), NULL, &dwType,
- (LPBYTE)m_szHostName, &dwDataSize);
- dwDataSize = 256;
- ::RegQueryValueEx(hMainKey, _T("EnableDNS"), NULL, &dwType,
- (LPBYTE)&m_EnableDNS, &dwDataSize);
- dwDataSize = 256;
- ::RegQueryValueEx(hMainKey, _T("NameServer"), NULL, &dwType,
- (LPBYTE)szNameServer, &dwDataSize);
- }
- ::RegCloseKey(hMainKey);
-
- HKEY hNetCard = NULL;
- //调用CTcpCfg类的静态函数得到网卡的数目和相应的MAC地址
- m_TotalNetCards = GetMacAddress(m_MacAddr);
- lRet = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,
- _T("System\\CurrentControlSet\\Services\\Class\\Net"),
- 0, KEY_READ, &hNetCard);
- if(lRet != ERROR_SUCCESS) //此处失败就返回
- {
- if(hNetCard != NULL)
- ::RegCloseKey(hNetCard);
- return FALSE;
- }
- DWORD dwSubKeyNum = 0,dwSubKeyLen = 256;
- //得到子键的个数,通常与网卡个数相等
- lRet = ::RegQueryInfoKey(hNetCard, NULL, NULL, NULL,
- &dwSubKeyNum, &dwSubKeyLen, NULL,NULL,NULL,NULL,NULL,NULL);
- if(lRet == ERROR_SUCCESS)
- {
- //m_TotalNetCards = dwSubKeyNum; //网卡个数以此为主
- LPTSTR lpszKeyName = new TCHAR[dwSubKeyLen + 1];
- DWORD dwSize;
- for(int i=0; i<(int)m_TotalNetCards; i++)
- {
- TCHAR szNewKey[256];
- HKEY hNewKey;
- DWORD dwType=REG_SZ, dwDataSize=256;
- dwSize = dwSubKeyLen + 1;
- lRet = ::RegEnumKeyEx(hNetCard, i, lpszKeyName,
- &dwSize, NULL, NULL, NULL, NULL);
- if(lRet == ERROR_SUCCESS)
- {
- lRet = ::RegOpenKeyEx(hNetCard,
- lpszKeyName, 0, KEY_READ, &hNewKey);
- if(lRet == ERROR_SUCCESS)
- ::RegQueryValueEx(hNewKey, _T("DriverDesc"), NULL,
- &dwType, (LPBYTE)m_Cards[i].szDescription, &dwDataSize);
- ::RegCloseKey(hNewKey);
- wsprintf(szNewKey,
- _T("System\\CurrentControlSet\\Services\\Class\\NetTrans\\%s"),
- lpszKeyName);
- lRet = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,
- szNewKey, 0, KEY_READ, &hNewKey);
- if(lRet == ERROR_SUCCESS)
- {
- dwDataSize = 256;
- ::RegQueryValueEx(hNewKey, _T("DefaultGateway"), NULL,
- &dwType, (LPBYTE)m_Cards[i].szGateWay, &dwDataSize);
- ProcessMultiString(m_Cards[i].szGateWay, dwDataSize);
- dwDataSize = 256;