Sysinfo.cpp
上传用户:szjkjd
上传日期:2022-06-27
资源大小:8968k
文件大小:10k
源码类别:

浏览器

开发平台:

Visual C++

  1. /*! @sysinfo.cpp
  2. *******************************************************************************
  3. <PRE>
  4. 模块名         : 获取计算机信息
  5. 文件名         : sysinfo.cpp
  6. 相关文件       : sysinfo.h、GetHardSoftInfo.h
  7. 文件实现功能   : 获取计算机信息,并拼接成一个字符串,便于发送到服务器端
  8. 作者           : 王小静
  9. 版本           : 1.0
  10. --------------------------------------------------------------------------------
  11. 备注           : -
  12. --------------------------------------------------------------------------------
  13. 修改记录 : 
  14. 日  期          版本            修改人          修改内容 
  15. 2010/02/08      1.0             王小静            创建
  16. </PRE>
  17. ********************************************************************************
  18. * 版权所有(c) 2010, 17jago, 保留所有权利
  19. *******************************************************************************/
  20. #include "StdAfx.h"
  21. #include ".sysinfo.h"
  22. #include <windows.h>
  23. #include <iostream>
  24. #include <winsock2.h>
  25. #include <Iphlpapi.h>
  26. #include <stdio.h>
  27. #include <stdlib.h>
  28. #include <string.h>
  29. #include <conio.h>
  30. #include <ddraw.h>
  31. #include <atlbase.h>
  32. #include <algorithm>
  33. #include <assert.h>
  34. #include "GetHardSoftInfo.h"  //获得硬件信息头文件
  35. //引入连接库
  36. #pragma comment(lib,"Iphlpapi.lib")
  37. #pragma   comment(lib,   "Strmiids.lib")
  38. using namespace std;
  39. //构造函数
  40. CSysinfo::CSysinfo(void)
  41. : m_disksize(_T(""))
  42. , c_send(NULL)
  43. {
  44. }
  45. //析构函数
  46. CSysinfo::~CSysinfo(void)
  47. {
  48. }
  49. /*! @GetProcessorInfo
  50. ************************************************************************************** <PRE> 函数名       : 获得计算机的cpu信息 功能         : 获得计算机的cpu信息,并复制给成员变量m_CpuInfo(cpu属性),m_cpuspeed(速度) 参数         : 无 返回值       : 成功1,失败0 -------------------------------------------------------------------------------- 备注         : -
  51. 典型用法     : -
  52. --------------------------------------------------------------------------------
  53. 作者         : 王小静
  54. </PRE> *************************************************************************************/
  55. int CSysinfo::GetProcessorInfo()
  56. {
  57. //初始化,用于做打开注册表的返回值
  58. LONG result;  
  59. //注册表类型
  60. HKEY hKey;
  61. //临时变量,保存注册表获得的信息
  62. TCHAR vendorData[250];
  63. //临时变量,辅助去掉cpu信息中的多个空格
  64. TCHAR m_tem[250]={0};
  65. //cpu的速率
  66. DWORD data;
  67. //字符串的大小
  68. DWORD dataSize;
  69. //临时变量保存,复制去掉cpu中的多个空格
  70. char *m_replace,*m_temp;
  71.  //打开注册表
  72. result = ::RegOpenKeyEx (HKEY_LOCAL_MACHINE,
  73. "Hardware\Description\System\CentralProcessor\0", 0, KEY_QUERY_VALUE, &hKey);  
  74. // 判断注册表是否读取成功
  75. if (result == ERROR_SUCCESS) 
  76. {
  77. //初始化
  78. dataSize = sizeof (vendorData);
  79. // 获得注册表中~MHz键值的内容,即cpu的速度
  80. result = ::RegQueryValueEx(hKey, ("~MHz"), NULL, NULL,
  81. (LPBYTE)&data, &dataSize);  
  82. //将cpu的速度装换成以GHz为单位
  83.         m_cpuspeed  =data/1000.0 ; 
  84.        
  85. dataSize = sizeof (vendorData);
  86.           //获得注册表中ProcessorNameString的属性值,即cpu的信息
  87.         result = ::RegQueryValueEx (hKey, ("ProcessorNameString"), NULL, NULL,(LPBYTE)&vendorData, &dataSize);
  88.         //将得到的数据复制给m_replace,做函数返回
  89. m_replace = vendorData; 
  90. //为中间变量赋值
  91.         m_temp = m_tem;
  92.         // 去掉m_replace中的多个空格,保证所有字符串之间只有一个空格
  93. while(*m_replace != '' )
  94. {
  95. *m_temp = *m_replace;
  96. m_temp++;
  97. //如果有两个以上空格,则去掉空格
  98. if (*m_replace == ' ')
  99. {
  100. do
  101. {
  102.                       m_replace++;
  103. }while(*m_replace == ' ');
  104. continue;
  105. }
  106. m_replace++;
  107. }
  108. //分配大小
  109. m_CpuInfo = (char *)malloc(sizeof (char)*1024);
  110. //判断是否分配成功
  111. if(NULL  == m_CpuInfo)
  112. {
  113. return 0;
  114. }
  115. //将去掉多个空格的cpu信息复制给公有成员变量
  116. m_CpuInfo = m_tem;
  117. //判断字符串中是否cpu速度,没有则拼接添加cpu速率
  118. char *buff = strstr(m_CpuInfo, "@"); 
  119. if( buff == NULL)
  120. {
  121. sprintf(m_CpuInfo + strlen(m_CpuInfo),"@ %0.2fGHZ",m_cpuspeed); 
  122. }
  123. //关闭注册表
  124. RegCloseKey (hKey);   
  125. }                  
  126. return 1;
  127. }
  128. /*! @MemoryInfo
  129. ************************************************************************************** <PRE> 函数名       : 获得计算机的内存信息 功能         : 获得计算机的内存信息,并分别复制给成员函数m_totalpagefile、m_totalphys              : m_availphys、m_totalvirtual 参数         : 无 返回值       : 成功1,失败0 -------------------------------------------------------------------------------- 备注         : -
  130. 典型用法     : -
  131. --------------------------------------------------------------------------------
  132. 作者         : 王小静
  133. </PRE> *************************************************************************************/
  134. int CSysinfo::MemoryInfo()
  135. {
  136. //内存结构体变量
  137. MEMORYSTATUSEX  memoryStatus; 
  138. //初始化结构体长度
  139. memoryStatus.dwLength = sizeof(MEMORYSTATUSEX);
  140. //获得4G内存
  141.     GlobalMemoryStatusEx(&memoryStatus);   
  142. //获得2G当前可用的物理和虚拟内存信息
  143. /*GlobalMemoryStatus (&memoryStatus); */ 
  144. //可用的页面文件大小,以MB为单位
  145. m_totalpagefile = memoryStatus.ullAvailPageFile/1024; 
  146. //总的物理内存大小,以GB为单位
  147. m_totalphys = (memoryStatus.ullTotalPhys/1024)/1024;   
  148.  //可用的物理内存大小,以MB为单位。
  149. m_availphys = memoryStatus.ullAvailPhys/1024;   
  150. //当前空闲地址空间
  151. m_totalvirtual = memoryStatus.ullTotalVirtual/1024;   
  152. return 1;
  153. }
  154. /*! @GetAdpoter
  155. ************************************************************************************** <PRE> 函数名       : 获得计算机的网卡的信息 功能         : 获得计算机的网卡的信息,并复制给成员变量Name[] 参数         : 无 返回值       : 成功1,失败0 -------------------------------------------------------------------------------- 备注         : -
  156. 典型用法     : -
  157. --------------------------------------------------------------------------------
  158. 作者         : 王小静
  159. </PRE> *************************************************************************************/
  160. bool CSysinfo::GetAdpoter()
  161. {
  162. //定义网卡结构体变量,保存网卡信息
  163. PIP_ADAPTER_INFO pAdapterInfo;  
  164. // 初始化网卡结构体变量
  165. PIP_ADAPTER_INFO pAdapter = NULL;
  166.   
  167. //获取网卡信息的返回值
  168. DWORD dwRetVal = 0;
  169. ULONG ulOutBufLen;
  170. //分配内存大小
  171. pAdapterInfo=(PIP_ADAPTER_INFO)malloc(sizeof(IP_ADAPTER_INFO));
  172. //初始化大小
  173. ulOutBufLen = sizeof(IP_ADAPTER_INFO);
  174. int i = 0;
  175. //依次是计算的ip地址,mask地址,和网关
  176. char *m_ip,*m_mask,*m_gateway;
  177. // 第一次调用GetAdapterInfo获取ulOutBufLen大小
  178. //判断是否溢出,如果溢出,释放内存,重新分配大小
  179. if (GetAdaptersInfo( pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW)  
  180. {
  181. free(pAdapterInfo);
  182. pAdapterInfo = (IP_ADAPTER_INFO *) malloc (ulOutBufLen); 
  183. }
  184. //判断是否成功获得计算机网卡信息
  185. if ((dwRetVal = GetAdaptersInfo( pAdapterInfo, &ulOutBufLen)) == NO_ERROR) 
  186. {
  187. pAdapter = pAdapterInfo;
  188. //如果信息存在
  189. while (pAdapter) 
  190. {
  191. //判断是否是本地网卡,如果是本地网卡则获取网卡信息,如果是其他网卡,不操作
  192. char *buff = strstr(pAdapter->Description,"PCI");   
  193. if(buff != NULL)
  194. {
  195. //得到网卡的MAC地址
  196. Name[0] = pAdapter->Address[0];
  197. Name[1] = pAdapter->Address[1];
  198. Name[2] = pAdapter->Address[2];
  199. Name[3] = pAdapter->Address[3];
  200. Name[4] = pAdapter->Address[4];
  201. Name[5] = pAdapter->Address[5];  
  202. //网卡的ip地址
  203. m_ip = pAdapter->IpAddressList.IpAddress.String;
  204.     //网卡的子网掩码    
  205. m_mask = pAdapter->IpAddressList.IpMask.String;  
  206. //网卡的网关
  207. m_gateway = pAdapter->GatewayList.IpAddress.String;  
  208. }
  209. pAdapter = pAdapter->Next; 
  210. }
  211. }
  212. return true;
  213.            
  214. }
  215. /*! @GetDIskSize
  216. ************************************************************************************** <PRE> 函数名       : 获得计算机的硬件的信息 功能         : 获得计算机的硬件的信息,复制给成员变量m_disksize,共系统调用 参数         : 无 返回值       : 成功true,失败false -------------------------------------------------------------------------------- 备注         : -
  217. 典型用法     : -
  218. --------------------------------------------------------------------------------
  219. 作者         : 王小静
  220. </PRE> *************************************************************************************/
  221. bool CSysinfo::GetDIskSize(void)
  222. {    
  223. //定义类实体
  224. CGetMachineInfo m_Info; 
  225. //获得硬件大小并赋值给m_disksize
  226. m_disksize = m_Info.str_HardDeskSize; 
  227. //判断m_diskzise是否正确。
  228. if(!(m_disksize))     
  229.          return false;
  230. }
  231. return true;
  232. }
  233. /*! @SendSysInfo
  234. ************************************************************************************** <PRE> 函数名       : 拼接计算机信息 功能         : 拼接计算机信息给c_send,供系统调用 参数         : 无 返回值       : 成功true,失败false -------------------------------------------------------------------------------- 备注         : -
  235. 典型用法     : -
  236. --------------------------------------------------------------------------------
  237. 作者         : 王小静
  238. </PRE> *************************************************************************************/
  239. bool CSysinfo::SendSysInfo(void)
  240. {
  241. //声明类对象
  242. CSysinfo sysinfo;     
  243. //获得网卡信息
  244. sysinfo.GetAdpoter();  
  245. //指针初始化,并作出判断
  246. c_send =  (char *)malloc(sizeof(char) * 1024);
  247. if (NULL == c_send)
  248. {
  249. return false;
  250. }
  251. //拼接MAC地址
  252. sprintf(c_send,"%02x:%02x:%02x:%02x:%02x:%02x|",sysinfo.Name[0],sysinfo.Name[1],sysinfo.Name[2],sysinfo.Name[3],sysinfo.Name[4],sysinfo.Name[5]); 
  253. //调用函数,获得cpu信息
  254. sysinfo.GetProcessorInfo();  
  255. //拼接cpu信息
  256. sprintf(c_send + strlen(c_send), "%s|", sysinfo.m_CpuInfo);
  257. //调用函数,获得内存信息
  258. sysinfo.MemoryInfo();
  259. //拼接计算机内存信息
  260. sprintf(c_send + strlen(c_send), "%dM|",sysinfo.m_totalphys);
  261. //调用函数,获得硬盘大小
  262. sysinfo.GetDIskSize();
  263. //拼接计算机网卡信息
  264. sprintf(c_send + strlen(c_send), "%s", sysinfo.m_disksize);
  265. return true;
  266. }