下面是头文件
/**//************************************************************************/
/**//*
* 作者:cpp
* 日期:2008-09-05
* 内容:提供了一个CSystemInformation类,该类可以获取CPU厂家,
* CPU频率,CPU个数,当前使用的CPU,系统运行时占用的
* CPU比率,系统运行的Idle时间,User时间以及Kernel时间
* 获取某个进程的句柄个数,获取随机数(比编译器自带更灵活),
* 以及将长整数(long long )转换为浮点数,宽字节与窄字节之间的互换
*
* 注意:有几个函数仅可以用在windows xp系统上,在其他系统上将失效或不起作用
* 因此,调用时需要注意,另外,如果转入到其他编译器_WIN32_WINNT用来
* 指示需要windows xp系统
*/
/**//************************************************************************/
#pragma once
#include<sstream>
#include <cassert>
#ifndef _WINBASE_
#include <WinBase.h>
#endif // _WINBASE_H
//#define _WIN32_WINNT // 该值已经在stdafx.h中被声明过,只能够用在winxp系统上
typedef struct _SYSTEM_BASIC_INFORMATION {
BYTE Reserved1[24];
PVOID Reserved2[4];
CCHAR NumberOfProcessors;
} SYSTEM_BASIC_INFORMATION; // 结构等同于SYSTEM_INFO
typedef struct
{
long long IdleTime;
DWORD dwReversed[76];
} SYSTEM_PERFORMANCE_INFORMATION;
typedef struct _SYSTEM_PROCESS_INFORMATION {
ULONG NextEntryOffset;
BYTE Reserved1[52];
PVOID Reserved2[3];
HANDLE UniqueProcessId;
PVOID Reserved3;
ULONG HandleCount;
BYTE Reserved4[4];
PVOID Reserved5[11];
SIZE_T PeakPagefileUsage;
SIZE_T PrivatePageCount;
LARGE_INTEGER Reserved6[6];
} SYSTEM_PROCESS_INFORMATION;
typedef struct
{
LARGE_INTEGER liKeBootTime;
LARGE_INTEGER liKeSystemTime;
LARGE_INTEGER liExpTimeZoneBias;
ULONG uCurrentTimeZoneId;
DWORD dwReserved;
} SYSTEM_TIME_INFORMATION; // 等同于GetSystemTimes获取到的三个数据
class CSystemInformation
{
public:
// 定义基础数据类型
typedef std::basic_string<TCHAR> string;
typedef std::basic_stringstream<TCHAR> stringstream;
typedef std::basic_string<BYTE> byteString;
public:
enum SYSTEM_INFORMATION
{
SystemBasicInformation = 0,
SystemPerformanceInformation = 2,
SystemTimeInformation = 3,
};
protected:
typedef DWORD (WINAPI* NTQUERYSYSTEMINFOMATION) (
SYSTEM_INFORMATION SystemInformationClass,
PVOID SystemInformation,
ULONG SystemInformationLength,
PULONG ReturnLength );
public:
CSystemInformation(void);
public:
~CSystemInformation(void);
public:
// 获取基础信息系统,并返回处理
const LPSYSTEM_INFO GetSystemInfo(void);
protected:
// 处理错误消息
void ProcessErrorMessage(TCHAR* ErrorText);
public:
// 产生给定长度的随机数,由windows系统产生,比C编译器产生的更加随机
byteString GenRandom(int len);
public:
// 返回转换后的wchar_t指针,并返回长度
wchar_t* ToChar(const char* str, int* len);
public:
// 返回转换后的char指针,并返回长度
char* ToChar(const wchar_t* str, int* len);
public:
// 获取本地机器的CPU硬件信息
string GetCPUCompany(void);
public:
// 获取CPU个数
int GetCPUNumbers(void);
public:
// 获取当前CPU编号-即当前使用的是哪个CPU
int GetCurrentCPU(void);
public:
// 获取某个打开进程的句柄个数
long GetProcessHandleCount(HANDLE hProcess);
public:
// 获取系统空闲时间
LPFILETIME GetIdleTime(void);
public:
// 获取系统核心运行时间
LPFILETIME GetKernelTime(void);
// 获取用户运行时间
LPFILETIME GetUserTime(void);
public:
// 获取系统(空闲,核心以及用户)运行时间
void GetSystemTimes(LPFILETIME IdleTime, LPFILETIME KernelTime, LPFILETIME UserTime, bool ImmediateRet=false);
public:
// 获取CPU占用率
double GetCPURate(void);
public:
// 将64位的长整数转换为64位的实数
double LongInt2Double(LARGE_INTEGER want);
public:
double LongInt2Double(long long want)
{
LARGE_INTEGER _want;
memcpy( &_want, &want, sizeof(LARGE_INTEGER) );
return LongInt2Double( _want );
}
double LongInt2Double(FILETIME want)
{
LARGE_INTEGER _want;
memcpy( &_want, &want, sizeof(LARGE_INTEGER) );
return LongInt2Double( _want);
}
public:
// 获取CPU的频率,高字节部分为主频,低字节部分为次频,以GHz为单位
int GetCPUFrenquence(void);
public:
// 获取当前使用的CPU编号
int GetCurrentUseCPU(void);
public:
// 获取注册表所能够达到的最大尺寸,以字节为单位
long GetMaxRegisterSize(void);
public:
// 获取当前注册表的尺寸,以字节为单位
long GetCurrRegisterSize(void);
private:
long long m_IdleTime;
long long m_KernelTime;
long long m_UserTime;
// 用来表示是否已经获取了系统的信息,true为已经获取,false为没有获取
bool m_bHasSystemInfo;
wchar_t *m_pWChar;
char *m_pchar;
private:
// 系统信息
SYSTEM_INFO m_system_info;
private:
// NTDLL.DLL 句柄
HMODULE m_hNtDll;
// NtQuerySystemInformation 函数地址
NTQUERYSYSTEMINFOMATION NtQuerySystemInformation;
};
/**//*
* 作者:cpp
* 日期:2008-09-05
* 内容:提供了一个CSystemInformation类,该类可以获取CPU厂家,
* CPU频率,CPU个数,当前使用的CPU,系统运行时占用的
* CPU比率,系统运行的Idle时间,User时间以及Kernel时间
* 获取某个进程的句柄个数,获取随机数(比编译器自带更灵活),
* 以及将长整数(long long )转换为浮点数,宽字节与窄字节之间的互换
*
* 注意:有几个函数仅可以用在windows xp系统上,在其他系统上将失效或不起作用
* 因此,调用时需要注意,另外,如果转入到其他编译器_WIN32_WINNT用来
* 指示需要windows xp系统
*/
/**//************************************************************************/
#pragma once
#include<sstream>
#include <cassert>
#ifndef _WINBASE_
#include <WinBase.h>
#endif // _WINBASE_H
//#define _WIN32_WINNT // 该值已经在stdafx.h中被声明过,只能够用在winxp系统上
typedef struct _SYSTEM_BASIC_INFORMATION {
BYTE Reserved1[24];
PVOID Reserved2[4];
CCHAR NumberOfProcessors;
} SYSTEM_BASIC_INFORMATION; // 结构等同于SYSTEM_INFO
typedef struct
{
long long IdleTime;
DWORD dwReversed[76];
} SYSTEM_PERFORMANCE_INFORMATION;
typedef struct _SYSTEM_PROCESS_INFORMATION {
ULONG NextEntryOffset;
BYTE Reserved1[52];
PVOID Reserved2[3];
HANDLE UniqueProcessId;
PVOID Reserved3;
ULONG HandleCount;
BYTE Reserved4[4];
PVOID Reserved5[11];
SIZE_T PeakPagefileUsage;
SIZE_T PrivatePageCount;
LARGE_INTEGER Reserved6[6];
} SYSTEM_PROCESS_INFORMATION;
typedef struct
{
LARGE_INTEGER liKeBootTime;
LARGE_INTEGER liKeSystemTime;
LARGE_INTEGER liExpTimeZoneBias;
ULONG uCurrentTimeZoneId;
DWORD dwReserved;
} SYSTEM_TIME_INFORMATION; // 等同于GetSystemTimes获取到的三个数据
class CSystemInformation
{
public:
// 定义基础数据类型
typedef std::basic_string<TCHAR> string;
typedef std::basic_stringstream<TCHAR> stringstream;
typedef std::basic_string<BYTE> byteString;
public:
enum SYSTEM_INFORMATION
{
SystemBasicInformation = 0,
SystemPerformanceInformation = 2,
SystemTimeInformation = 3,
};
protected:
typedef DWORD (WINAPI* NTQUERYSYSTEMINFOMATION) (
SYSTEM_INFORMATION SystemInformationClass,
PVOID SystemInformation,
ULONG SystemInformationLength,
PULONG ReturnLength );
public:
CSystemInformation(void);
public:
~CSystemInformation(void);
public:
// 获取基础信息系统,并返回处理
const LPSYSTEM_INFO GetSystemInfo(void);
protected:
// 处理错误消息
void ProcessErrorMessage(TCHAR* ErrorText);
public:
// 产生给定长度的随机数,由windows系统产生,比C编译器产生的更加随机
byteString GenRandom(int len);
public:
// 返回转换后的wchar_t指针,并返回长度
wchar_t* ToChar(const char* str, int* len);
public:
// 返回转换后的char指针,并返回长度
char* ToChar(const wchar_t* str, int* len);
public:
// 获取本地机器的CPU硬件信息
string GetCPUCompany(void);
public:
// 获取CPU个数
int GetCPUNumbers(void);
public:
// 获取当前CPU编号-即当前使用的是哪个CPU
int GetCurrentCPU(void);
public:
// 获取某个打开进程的句柄个数
long GetProcessHandleCount(HANDLE hProcess);
public:
// 获取系统空闲时间
LPFILETIME GetIdleTime(void);
public:
// 获取系统核心运行时间
LPFILETIME GetKernelTime(void);
// 获取用户运行时间
LPFILETIME GetUserTime(void);
public:
// 获取系统(空闲,核心以及用户)运行时间
void GetSystemTimes(LPFILETIME IdleTime, LPFILETIME KernelTime, LPFILETIME UserTime, bool ImmediateRet=false);
public:
// 获取CPU占用率
double GetCPURate(void);
public:
// 将64位的长整数转换为64位的实数
double LongInt2Double(LARGE_INTEGER want);
public:
double LongInt2Double(long long want)
{
LARGE_INTEGER _want;
memcpy( &_want, &want, sizeof(LARGE_INTEGER) );
return LongInt2Double( _want );
}
double LongInt2Double(FILETIME want)
{
LARGE_INTEGER _want;
memcpy( &_want, &want, sizeof(LARGE_INTEGER) );
return LongInt2Double( _want);
}
public:
// 获取CPU的频率,高字节部分为主频,低字节部分为次频,以GHz为单位
int GetCPUFrenquence(void);
public:
// 获取当前使用的CPU编号
int GetCurrentUseCPU(void);
public:
// 获取注册表所能够达到的最大尺寸,以字节为单位
long GetMaxRegisterSize(void);
public:
// 获取当前注册表的尺寸,以字节为单位
long GetCurrRegisterSize(void);
private:
long long m_IdleTime;
long long m_KernelTime;
long long m_UserTime;
// 用来表示是否已经获取了系统的信息,true为已经获取,false为没有获取
bool m_bHasSystemInfo;
wchar_t *m_pWChar;
char *m_pchar;
private:
// 系统信息
SYSTEM_INFO m_system_info;
private:
// NTDLL.DLL 句柄
HMODULE m_hNtDll;
// NtQuerySystemInformation 函数地址
NTQUERYSYSTEMINFOMATION NtQuerySystemInformation;
};
下面是实现文件:
/**//************************************************************************/
/**//*
* 作者:cpp
* 日期:2008-09-05
* 内容:提供了一个CSystemInformation类,该类可以获取CPU厂家,
* CPU频率,CPU个数,当前使用的CPU,系统运行时占用的
* CPU比率,系统运行的Idle时间,User时间以及Kernel时间
* 获取某个进程的句柄个数,获取随机数(比编译器自带更灵活),
* 将长整数(long long )转换为浮点数,宽字节与窄字节之间的互换
* 注册表最大容量,当前注册表容量
*/
/**//************************************************************************/
//#include "stdafx.h"
#include <windows.h>
#include "SystemInformation.h"
#include <WinCrypt.h>
#include <winbase.h>
CSystemInformation::CSystemInformation()
: m_bHasSystemInfo(false)
{
m_pWChar = NULL;
m_pchar = NULL;
m_hNtDll = NULL;
m_bHasSystemInfo = false;
::memset( &m_system_info, 0, sizeof(m_system_info));
m_hNtDll = ::LoadLibrary(TEXT("ntdll.dll"));
if( NULL == m_hNtDll)
{
this->ProcessErrorMessage(TEXT("没有载入ntdll.dll文件!"));
return ;
}
this->NtQuerySystemInformation = (NTQUERYSYSTEMINFOMATION) GetProcAddress(
m_hNtDll, "NtQuerySystemInformation"
);
if( NULL== NtQuerySystemInformation )
{
this->ProcessErrorMessage(TEXT("没有找到NtQuerySystemInformation地址!"));
return ;
}
}
CSystemInformation::~CSystemInformation()
{
if( NULL != m_pWChar)
{
delete []m_pWChar;
m_pWChar = NULL;
}
if( NULL != m_pchar )
{
delete []m_pchar;
m_pchar = NULL;
}
if( NULL != m_hNtDll )
{
FreeLibrary(m_hNtDll);
m_hNtDll = NULL;
}
}
void CSystemInformation::ProcessErrorMessage( TCHAR* ErrorText )
{
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
stringstream ss;
ss << TEXT("警告:") << ErrorText << TEXT("存在下面的错误:\n")
<< lpMsgBuf << std::endl;
MessageBox(NULL, ss.str().c_str(), TEXT("程序错误"), MB_ICONSTOP);
LocalFree(lpMsgBuf);
}
const LPSYSTEM_INFO CSystemInformation::GetSystemInfo( void )
{
::GetSystemInfo( &m_system_info );
m_bHasSystemInfo = true;
return &m_system_info;
/**//*
* 作者:cpp
* 日期:2008-09-05
* 内容:提供了一个CSystemInformation类,该类可以获取CPU厂家,
* CPU频率,CPU个数,当前使用的CPU,系统运行时占用的
* CPU比率,系统运行的Idle时间,User时间以及Kernel时间
* 获取某个进程的句柄个数,获取随机数(比编译器自带更灵活),
* 将长整数(long long )转换为浮点数,宽字节与窄字节之间的互换
* 注册表最大容量,当前注册表容量
*/
/**//************************************************************************/
//#include "stdafx.h"
#include <windows.h>
#include "SystemInformation.h"
#include <WinCrypt.h>
#include <winbase.h>
CSystemInformation::CSystemInformation()
: m_bHasSystemInfo(false)
{
m_pWChar = NULL;
m_pchar = NULL;
m_hNtDll = NULL;
m_bHasSystemInfo = false;
::memset( &m_system_info, 0, sizeof(m_system_info));
m_hNtDll = ::LoadLibrary(TEXT("ntdll.dll"));
if( NULL == m_hNtDll)
{
this->ProcessErrorMessage(TEXT("没有载入ntdll.dll文件!"));
return ;
}
this->NtQuerySystemInformation = (NTQUERYSYSTEMINFOMATION) GetProcAddress(
m_hNtDll, "NtQuerySystemInformation"
);
if( NULL== NtQuerySystemInformation )
{
this->ProcessErrorMessage(TEXT("没有找到NtQuerySystemInformation地址!"));
return ;
}
}
CSystemInformation::~CSystemInformation()
{
if( NULL != m_pWChar)
{
delete []m_pWChar;
m_pWChar = NULL;
}
if( NULL != m_pchar )
{
delete []m_pchar;
m_pchar = NULL;
}
if( NULL != m_hNtDll )
{
FreeLibrary(m_hNtDll);
m_hNtDll = NULL;
}
}
void CSystemInformation::ProcessErrorMessage( TCHAR* ErrorText )
{
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
stringstream ss;
ss << TEXT("警告:") << ErrorText << TEXT("存在下面的错误:\n")
<< lpMsgBuf << std::endl;
MessageBox(NULL, ss.str().c_str(), TEXT("程序错误"), MB_ICONSTOP);
LocalFree(lpMsgBuf);
}
const LPSYSTEM_INFO CSystemInformation::GetSystemInfo( void )
{
::GetSystemInfo( &m_system_info );
m_bHasSystemInfo = true;
return &m_system_info;