设为首页 加入收藏

TOP

1.1.4 小试牛刀--编程实现获取MAC地址(2)
2013-10-07 15:51:45 来源: 作者: 【 】 浏览:132
Tags:1.1.4 小试牛刀 编程 实现 获取 MAC 地址

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

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

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇1.1.4 小试牛刀--编程实现获取MAC.. 下一篇1.1.4 小试牛刀--编程实现获取MAC..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·常用meta整理 | 菜鸟 (2025-12-25 01:21:52)
·SQL HAVING 子句:深 (2025-12-25 01:21:47)
·SQL CREATE INDEX 语 (2025-12-25 01:21:45)
·Shell 传递参数 (2025-12-25 00:50:45)
·Linux echo 命令 - (2025-12-25 00:50:43)