Sysinfo.cpp
资源名称:Client.rar [点击查看]
上传用户:szjkjd
上传日期:2022-06-27
资源大小:8968k
文件大小:10k
源码类别:
浏览器
开发平台:
Visual C++
- /*! @sysinfo.cpp
- *******************************************************************************
- <PRE>
- 模块名 : 获取计算机信息
- 文件名 : sysinfo.cpp
- 相关文件 : sysinfo.h、GetHardSoftInfo.h
- 文件实现功能 : 获取计算机信息,并拼接成一个字符串,便于发送到服务器端
- 作者 : 王小静
- 版本 : 1.0
- --------------------------------------------------------------------------------
- 备注 : -
- --------------------------------------------------------------------------------
- 修改记录 :
- 日 期 版本 修改人 修改内容
- 2010/02/08 1.0 王小静 创建
- </PRE>
- ********************************************************************************
- * 版权所有(c) 2010, 17jago, 保留所有权利
- *******************************************************************************/
- #include "StdAfx.h"
- #include ".sysinfo.h"
- #include <windows.h>
- #include <iostream>
- #include <winsock2.h>
- #include <Iphlpapi.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <conio.h>
- #include <ddraw.h>
- #include <atlbase.h>
- #include <algorithm>
- #include <assert.h>
- #include "GetHardSoftInfo.h" //获得硬件信息头文件
- //引入连接库
- #pragma comment(lib,"Iphlpapi.lib")
- #pragma comment(lib, "Strmiids.lib")
- using namespace std;
- //构造函数
- CSysinfo::CSysinfo(void)
- : m_disksize(_T(""))
- , c_send(NULL)
- {
- }
- //析构函数
- CSysinfo::~CSysinfo(void)
- {
- }
- /*! @GetProcessorInfo
- ************************************************************************************** <PRE> 函数名 : 获得计算机的cpu信息 功能 : 获得计算机的cpu信息,并复制给成员变量m_CpuInfo(cpu属性),m_cpuspeed(速度) 参数 : 无 返回值 : 成功1,失败0 -------------------------------------------------------------------------------- 备注 : -
- 典型用法 : -
- --------------------------------------------------------------------------------
- 作者 : 王小静
- </PRE> *************************************************************************************/
- int CSysinfo::GetProcessorInfo()
- {
- //初始化,用于做打开注册表的返回值
- LONG result;
- //注册表类型
- HKEY hKey;
- //临时变量,保存注册表获得的信息
- TCHAR vendorData[250];
- //临时变量,辅助去掉cpu信息中的多个空格
- TCHAR m_tem[250]={0};
- //cpu的速率
- DWORD data;
- //字符串的大小
- DWORD dataSize;
- //临时变量保存,复制去掉cpu中的多个空格
- char *m_replace,*m_temp;
- //打开注册表
- result = ::RegOpenKeyEx (HKEY_LOCAL_MACHINE,
- "Hardware\Description\System\CentralProcessor\0", 0, KEY_QUERY_VALUE, &hKey);
- // 判断注册表是否读取成功
- if (result == ERROR_SUCCESS)
- {
- //初始化
- dataSize = sizeof (vendorData);
- // 获得注册表中~MHz键值的内容,即cpu的速度
- result = ::RegQueryValueEx(hKey, ("~MHz"), NULL, NULL,
- (LPBYTE)&data, &dataSize);
- //将cpu的速度装换成以GHz为单位
- m_cpuspeed =data/1000.0 ;
- dataSize = sizeof (vendorData);
- //获得注册表中ProcessorNameString的属性值,即cpu的信息
- result = ::RegQueryValueEx (hKey, ("ProcessorNameString"), NULL, NULL,(LPBYTE)&vendorData, &dataSize);
- //将得到的数据复制给m_replace,做函数返回
- m_replace = vendorData;
- //为中间变量赋值
- m_temp = m_tem;
- // 去掉m_replace中的多个空格,保证所有字符串之间只有一个空格
- while(*m_replace != ' ' )
- {
- *m_temp = *m_replace;
- m_temp++;
- //如果有两个以上空格,则去掉空格
- if (*m_replace == ' ')
- {
- do
- {
- m_replace++;
- }while(*m_replace == ' ');
- continue;
- }
- m_replace++;
- }
- //分配大小
- m_CpuInfo = (char *)malloc(sizeof (char)*1024);
- //判断是否分配成功
- if(NULL == m_CpuInfo)
- {
- return 0;
- }
- //将去掉多个空格的cpu信息复制给公有成员变量
- m_CpuInfo = m_tem;
- //判断字符串中是否cpu速度,没有则拼接添加cpu速率
- char *buff = strstr(m_CpuInfo, "@");
- if( buff == NULL)
- {
- sprintf(m_CpuInfo + strlen(m_CpuInfo),"@ %0.2fGHZ",m_cpuspeed);
- }
- //关闭注册表
- RegCloseKey (hKey);
- }
- return 1;
- }
- /*! @MemoryInfo
- ************************************************************************************** <PRE> 函数名 : 获得计算机的内存信息 功能 : 获得计算机的内存信息,并分别复制给成员函数m_totalpagefile、m_totalphys : m_availphys、m_totalvirtual 参数 : 无 返回值 : 成功1,失败0 -------------------------------------------------------------------------------- 备注 : -
- 典型用法 : -
- --------------------------------------------------------------------------------
- 作者 : 王小静
- </PRE> *************************************************************************************/
- int CSysinfo::MemoryInfo()
- {
- //内存结构体变量
- MEMORYSTATUSEX memoryStatus;
- //初始化结构体长度
- memoryStatus.dwLength = sizeof(MEMORYSTATUSEX);
- //获得4G内存
- GlobalMemoryStatusEx(&memoryStatus);
- //获得2G当前可用的物理和虚拟内存信息
- /*GlobalMemoryStatus (&memoryStatus); */
- //可用的页面文件大小,以MB为单位
- m_totalpagefile = memoryStatus.ullAvailPageFile/1024;
- //总的物理内存大小,以GB为单位
- m_totalphys = (memoryStatus.ullTotalPhys/1024)/1024;
- //可用的物理内存大小,以MB为单位。
- m_availphys = memoryStatus.ullAvailPhys/1024;
- //当前空闲地址空间
- m_totalvirtual = memoryStatus.ullTotalVirtual/1024;
- return 1;
- }
- /*! @GetAdpoter
- ************************************************************************************** <PRE> 函数名 : 获得计算机的网卡的信息 功能 : 获得计算机的网卡的信息,并复制给成员变量Name[] 参数 : 无 返回值 : 成功1,失败0 -------------------------------------------------------------------------------- 备注 : -
- 典型用法 : -
- --------------------------------------------------------------------------------
- 作者 : 王小静
- </PRE> *************************************************************************************/
- bool CSysinfo::GetAdpoter()
- {
- //定义网卡结构体变量,保存网卡信息
- PIP_ADAPTER_INFO pAdapterInfo;
- // 初始化网卡结构体变量
- PIP_ADAPTER_INFO pAdapter = NULL;
- //获取网卡信息的返回值
- DWORD dwRetVal = 0;
- ULONG ulOutBufLen;
- //分配内存大小
- pAdapterInfo=(PIP_ADAPTER_INFO)malloc(sizeof(IP_ADAPTER_INFO));
- //初始化大小
- ulOutBufLen = sizeof(IP_ADAPTER_INFO);
- int i = 0;
- //依次是计算的ip地址,mask地址,和网关
- char *m_ip,*m_mask,*m_gateway;
- // 第一次调用GetAdapterInfo获取ulOutBufLen大小
- //判断是否溢出,如果溢出,释放内存,重新分配大小
- if (GetAdaptersInfo( pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW)
- {
- free(pAdapterInfo);
- pAdapterInfo = (IP_ADAPTER_INFO *) malloc (ulOutBufLen);
- }
- //判断是否成功获得计算机网卡信息
- if ((dwRetVal = GetAdaptersInfo( pAdapterInfo, &ulOutBufLen)) == NO_ERROR)
- {
- pAdapter = pAdapterInfo;
- //如果信息存在
- while (pAdapter)
- {
- //判断是否是本地网卡,如果是本地网卡则获取网卡信息,如果是其他网卡,不操作
- char *buff = strstr(pAdapter->Description,"PCI");
- if(buff != NULL)
- {
- //得到网卡的MAC地址
- Name[0] = pAdapter->Address[0];
- Name[1] = pAdapter->Address[1];
- Name[2] = pAdapter->Address[2];
- Name[3] = pAdapter->Address[3];
- Name[4] = pAdapter->Address[4];
- Name[5] = pAdapter->Address[5];
- //网卡的ip地址
- m_ip = pAdapter->IpAddressList.IpAddress.String;
- //网卡的子网掩码
- m_mask = pAdapter->IpAddressList.IpMask.String;
- //网卡的网关
- m_gateway = pAdapter->GatewayList.IpAddress.String;
- }
- pAdapter = pAdapter->Next;
- }
- }
- return true;
- }
- /*! @GetDIskSize
- ************************************************************************************** <PRE> 函数名 : 获得计算机的硬件的信息 功能 : 获得计算机的硬件的信息,复制给成员变量m_disksize,共系统调用 参数 : 无 返回值 : 成功true,失败false -------------------------------------------------------------------------------- 备注 : -
- 典型用法 : -
- --------------------------------------------------------------------------------
- 作者 : 王小静
- </PRE> *************************************************************************************/
- bool CSysinfo::GetDIskSize(void)
- {
- //定义类实体
- CGetMachineInfo m_Info;
- //获得硬件大小并赋值给m_disksize
- m_disksize = m_Info.str_HardDeskSize;
- //判断m_diskzise是否正确。
- if(!(m_disksize))
- {
- return false;
- }
- return true;
- }
- /*! @SendSysInfo
- ************************************************************************************** <PRE> 函数名 : 拼接计算机信息 功能 : 拼接计算机信息给c_send,供系统调用 参数 : 无 返回值 : 成功true,失败false -------------------------------------------------------------------------------- 备注 : -
- 典型用法 : -
- --------------------------------------------------------------------------------
- 作者 : 王小静
- </PRE> *************************************************************************************/
- bool CSysinfo::SendSysInfo(void)
- {
- //声明类对象
- CSysinfo sysinfo;
- //获得网卡信息
- sysinfo.GetAdpoter();
- //指针初始化,并作出判断
- c_send = (char *)malloc(sizeof(char) * 1024);
- if (NULL == c_send)
- {
- return false;
- }
- //拼接MAC地址
- 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]);
- //调用函数,获得cpu信息
- sysinfo.GetProcessorInfo();
- //拼接cpu信息
- sprintf(c_send + strlen(c_send), "%s|", sysinfo.m_CpuInfo);
- //调用函数,获得内存信息
- sysinfo.MemoryInfo();
- //拼接计算机内存信息
- sprintf(c_send + strlen(c_send), "%dM|",sysinfo.m_totalphys);
- //调用函数,获得硬盘大小
- sysinfo.GetDIskSize();
- //拼接计算机网卡信息
- sprintf(c_send + strlen(c_send), "%s", sysinfo.m_disksize);
- return true;
- }