1.1.4 小试牛刀--编程(www.cppentry.com)实现获取MAC地址(3)
- ::RegQueryValueEx(hNewKey,_T("IPAddress"), NULL,
- &dwType, (LPBYTE)m_Cards[i].szIpAddress, &dwDataSize);
- ProcessMultiString(m_Cards[i].szIpAddress, dwDataSize);
- dwDataSize = 256;
- ::RegQueryValueEx(hNewKey, _T("IPMask"), NULL, &dwType,
- (LPBYTE)m_Cards[i].szIpMask, &dwDataSize);
- ProcessMultiString(m_Cards[i].szIpMask, dwDataSize);
- //拷贝前面得到的DNS主机名
- _tcscpy(m_Cards[i].szDNSNameServer, szNameServer);
- }
- ::RegCloseKey(hNewKey);
- }
- m_Cards[i].szMacAddr[0] = m_MacAddr[i].b1;
- m_Cards[i].szMacAddr[1] = m_MacAddr[i].b2;
- m_Cards[i].szMacAddr[2] = m_MacAddr[i].b3;
- m_Cards[i].szMacAddr[3] = m_MacAddr[i].b4;
- m_Cards[i].szMacAddr[4] = m_MacAddr[i].b5;
- m_Cards[i].szMacAddr[5] = m_MacAddr[i].b6;
- }
- }
- ::RegCloseKey(hNetCard);
- return lRet == ERROR_SUCCESS TRUE : FALSE;
- }
- int ClassNetSetting::GetMacAddress(LPMAC_ADDRESS pMacAddr)
- {
- NCB ncb;
- UCHAR uRetCode;
- int num = 0;
- LANA_ENUM lana_enum;
- memset(&ncb, 0, sizeof(ncb));
- ncb.ncb_command = NCBENUM;
- ncb.ncb_buffer = (unsigned char *)&lana_enum;
- ncb.ncb_length = sizeof(lana_enum);
- //向网卡发送NCBENUM命令,以获取当前机器的网卡信息,如有多少个网卡,
- //每张网卡的编号等
- uRetCode = Netbios(&ncb);
- if (uRetCode == 0)
- {
- num = lana_enum.length;
- //对每一张网卡,以其网卡编号为输入编号,获取其MAC地址
- for (int i=0; i<num; i++)
- {
- ASTAT Adapter;
- if(GetAddressByIndex(lana_enum.lana[i],Adapter) == 0)
- {
- pMacAddr[i].b1 = Adapter.adapt.adapter_address[0];
- pMacAddr[i].b2 = Adapter.adapt.adapter_address[1];
- pMacAddr[i].b3 = Adapter.adapt.adapter_address[2];
- pMacAddr[i].b4 = Adapter.adapt.adapter_address[3];
- pMacAddr[i].b5 = Adapter.adapt.adapter_address[4];
- pMacAddr[i].b6 = Adapter.adapt.adapter_address[5];
- }
- }
- }
- return num;
- }
- BOOL ClassNetSetting::GetSettingOfWinNT()
- {
- LONG lRtn;
- HKEY hMainKey;
- TCHAR szParameters[256];
- //获得域名,主机名和是否使用IP路由
- _tcscpy(szParameters,
- _T("SYSTEM\\ControlSet001\\Services\\Tcpip\\Parameters"));
- lRtn = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,
- szParameters, 0, KEY_READ, &hMainKey);
- if(lRtn == 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("IPEnableRouter"), NULL, &dwType,
- (LPBYTE)&m_IPEnableRouter, &dwDataSize);
- }
- ::RegCloseKey(hMainKey);
-
- //获得IP地址和DNS解析等其他设置
- HKEY hNetCard = NULL;
- m_TotalNetCards = GetMacAddress(m_MacAddr);
- lRtn = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,
- _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards"),
- 0, KEY_READ, &hNetCard);
- if(lRtn != ERROR_SUCCESS) //此处失败就返回
- {
- if(hNetCard != NULL)
- ::RegCloseKey(hNetCard);
- return FALSE;
- }
- DWORD dwSubKeyNum=0, dwSubKeyLen=256;
- //得到子键的个数,通常与网卡个数相等
- lRtn = ::RegQueryInfoKey(hNetCard, NULL, NULL, NULL,
- &dwSubKeyNum, &dwSubKeyLen, NULL,NULL,NULL,NULL,NULL,NULL);
- if(lRtn == ERROR_SUCCESS)
- {
- m_TotalNetCards = dwSubKeyNum; //网卡个数以此为主
- LPTSTR lpszKeyName = new TCHAR[dwSubKeyLen + 1];
- DWORD dwSize;
- for(int i=0; i<(int)dwSubKeyNum; i++)
- {
- TCHAR szServiceName[256];