1. 程式人生 > >獲取(檢測)電腦硬體資訊(C++)

獲取(檢測)電腦硬體資訊(C++)

檢測資訊:

  1. 電腦系統、版本、位
  2. cpu資訊
  3. 記憶體狀態
  4. 顯示卡資訊
  5. 網絡卡資訊、介面卡、MAC實體地址
  6. IP資訊

.h檔案

//Get Windows system informantion
static const int kMaxInfoBuffer = 256;
#define  GBYTES  1073741824
#define  MBYTES  1048576
#define  KBYTES  1024
#define  DKBYTES 1024.0
void SafeGetNativeSystemInfo(LPSYSTEM_INFO lpSystemInfo);
const std::string  GetCpuInfo();
const std::string  GetOsVersion();
const std::string  GetMemoryStatus();
const std::wstring GetComputerUerName();
const std::string  GetDisplayCardinfo();
void  GetNetCardAndIPInfo(std::string &adapter_info, std::string &MAC_address, std::string &IP);

.cpp檔案

const std::string GetOsVersion()
{
	std::string os_version("");
	SYSTEM_INFO system_info;
	memset(&system_info,0,sizeof(SYSTEM_INFO));
	GetSystemInfo(&system_info);
	OSVERSIONINFOEX os; 
	os.dwOSVersionInfoSize=sizeof(OSVERSIONINFOEX);  
	if(GetVersionEx((OSVERSIONINFO *)&os))                 
	{ 
		switch(os.dwMajorVersion){                      
		case 4: 
			//1996年7月釋出 
			switch(os.dwMinorVersion){            
			case 0: 
				if(os.dwPlatformId==VER_PLATFORM_WIN32_NT) 
					os_version="Microsoft Windows NT 4.0 ";             
				else if(os.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS) 
					os_version="Microsoft Windows 95 "; 
				break; 
			case 10: 
				os_version="Microsoft Windows 98 "; 
				break; 
			case 90: 
				os_version="Microsoft Windows Me "; 
				break; 
			} 
			break; 
		case 5: 
			switch(os.dwMinorVersion){
				//1999年12月釋出 
			case 0: 
				os_version="Microsoft Windows 2000 ";  
				if(os.wSuiteMask==VER_SUITE_ENTERPRISE) 
					os_version.append("Advanced Server "); 
				break; 
				//2001年8月釋出 
			case 1: 
				os_version="Microsoft Windows XP ";  
				if(os.wSuiteMask==VER_SUITE_EMBEDDEDNT) 
					os_version.append("Embedded "); 
				else if(os.wSuiteMask==VER_SUITE_PERSONAL) 
					os_version.append("Home Edition "); 
				else
					os_version.append("Professional ");
				break; 
			case 2: 
				if(os.wProductType==VER_NT_WORKSTATION &&
					system_info.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)
					os_version="Microsoft Windows XP Professional x64 Edition "; 
				if(GetSystemMetrics(SM_SERVERR2)==0 && os.wSuiteMask==VER_SUITE_BLADE)
					os_version ="Microsoft Windows Server 2003 Web Edition "; 
				else if(GetSystemMetrics(SM_SERVERR2)==0 && os.wSuiteMask==VER_SUITE_COMPUTE_SERVER) 
					os_version=("Microsoft Windows Server 2003 Compute Cluster Edition "); 
				else if(GetSystemMetrics(SM_SERVERR2)==0 &&  os.wSuiteMask==VER_SUITE_STORAGE_SERVER) 
					os_version=("Microsoft Windows Server 2003 Storage Server "); 
				else if(GetSystemMetrics(SM_SERVERR2)==0 &&   os.wSuiteMask==VER_SUITE_DATACENTER) 
					os_version=("Microsoft Windows Server 2003 Datacenter Edition "); 
				else if(GetSystemMetrics(SM_SERVERR2)==0 &&   os.wSuiteMask==VER_SUITE_ENTERPRISE) 
					os_version=("Microsoft Windows Server 2003 Enterprise Edition "); 
				else if(GetSystemMetrics(SM_SERVERR2)!=0 &&   os.wSuiteMask==VER_SUITE_STORAGE_SERVER)
					os_version=("Microsoft Windows Server 2003 R2 Storage Server ");
				break; 
			} 
			break; 
		case 6: 
			switch(os.dwMinorVersion){ 
			case 0: 
				if(os.wProductType==VER_NT_WORKSTATION)
				{
					os_version="Microsoft Windows Vista "; 
					if (os.wSuiteMask==VER_SUITE_PERSONAL)
						os_version.append("Home ");
				}				
				else if(os.wProductType!=VER_NT_WORKSTATION)
				{
					os_version="Microsoft Windows Server 2008 ";
					if ( os.wSuiteMask==VER_SUITE_DATACENTER)
						os_version.append("Datacenter Server ");
					else if (os.wSuiteMask==VER_SUITE_ENTERPRISE)
						os_version.append("Enterprise ");
				}
				break; 
			case 1: 
				if(os.wProductType==VER_NT_WORKSTATION) 
					os_version="Microsoft Windows 7 "; 
				else
					os_version="Microsoft Windows Server 2008 R2 "; 
				break; 
			} 
			break; 
		default: 
			os_version="? "; 
		} 
	}
	SYSTEM_INFO si;
	SafeGetNativeSystemInfo(&si);
	if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 ||  
		si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64 )
		os_version.append("64bit");   
	else os_version.append("32bit");
	return os_version;
}

void SafeGetNativeSystemInfo( LPSYSTEM_INFO lpSystemInfo )
{
	if (NULL == lpSystemInfo)
		return;  
	typedef VOID (WINAPI *LPFN_GetNativeSystemInfo)(LPSYSTEM_INFO lpSystemInfo); 
	LPFN_GetNativeSystemInfo nsInfo = 
		(LPFN_GetNativeSystemInfo)GetProcAddress(GetModuleHandle(_T("kernel32")), "GetNativeSystemInfo");;  
	if (NULL != nsInfo)  
	{  
		nsInfo(lpSystemInfo);  
	}  
	else  
	{  
		GetSystemInfo(lpSystemInfo);  
	} 
}

const std::wstring GetComputerUerName()
{
	std::wstring uer_name(L"");
	wchar_t  buffer[kMaxInfoBuffer];
	DWORD length=kMaxInfoBuffer;
	if (GetComputerName(buffer, &length))
		uer_name.append(buffer,length);
	return uer_name;
}

const std::string GetMemoryStatus()
{
	std::string memory_info("");
	MEMORYSTATUSEX statusex;
	statusex.dwLength = sizeof(statusex);
	if (GlobalMemoryStatusEx(&statusex))
	{
		unsigned long long total = 0, remain_total = 0, avl = 0, remain_avl = 0;
		double decimal_total = 0, decimal_avl = 0;
		remain_total = statusex.ullTotalPhys % GBYTES;
		total = statusex.ullTotalPhys / GBYTES;
		avl = statusex.ullAvailPhys / GBYTES;
		remain_avl = statusex.ullAvailPhys % GBYTES;
		if (remain_total > 0)
			decimal_total = (remain_total / MBYTES) / DKBYTES;
		if (remain_avl > 0)
			decimal_avl = (remain_avl / MBYTES) / DKBYTES;

		decimal_total += (double) total;
		decimal_avl += (double) avl;
		char  buffer[kMaxInfoBuffer];
		sprintf_s(buffer,kMaxInfoBuffer, "%.2f GB (%.2f GB可用)", decimal_total, decimal_avl);	
		memory_info.append(buffer);
	}
	return memory_info;
}

void GetNetCardAndIPInfo(std::string &adapter_info, std::string &MAC_address, std::string &IP)
{
	PIP_ADAPTER_INFO pIp_adapter_info = new IP_ADAPTER_INFO();
	unsigned long adapter_size = sizeof(IP_ADAPTER_INFO);
	int ret = GetAdaptersInfo(pIp_adapter_info,&adapter_size);
	if (ERROR_BUFFER_OVERFLOW == ret)
	{
		delete pIp_adapter_info;
		pIp_adapter_info = (PIP_ADAPTER_INFO)new BYTE[adapter_size];
		ret=GetAdaptersInfo(pIp_adapter_info,&adapter_size);    
	}	
	if (ERROR_SUCCESS == ret)
	{
		while (pIp_adapter_info)
		{
			adapter_info.append("name: ");
			adapter_info.append(pIp_adapter_info->AdapterName);
			adapter_info.append("\ndescription: ");
			adapter_info.append(pIp_adapter_info->Description);
			adapter_info.append("\ntype: ");
			std::string card_type("");
			switch(pIp_adapter_info->Type)
			{
			case MIB_IF_TYPE_OTHER:
				card_type="other";
				break;
			case MIB_IF_TYPE_ETHERNET:
				card_type="ethernet";
				break;
			case MIB_IF_TYPE_TOKENRING:
				card_type="tokenring";
				break;
			case MIB_IF_TYPE_FDDI:
				card_type="fddi";
				break;
			case MIB_IF_TYPE_PPP:
				card_type="ppp";
				break;
			case MIB_IF_TYPE_LOOPBACK:
				card_type="loopback";
				break;
			case MIB_IF_TYPE_SLIP:
				card_type="slip";
				break;
			default:
				break;
			}
			adapter_info.append(card_type);
			MAC_address.append("\nMACAddr: ");
			char  buffer[kMaxInfoBuffer];
			for (DWORD i = 0; i < pIp_adapter_info->AddressLength; i++)
				if (i < pIp_adapter_info->AddressLength-1)
				{
					sprintf_s(buffer,kMaxInfoBuffer, "%02X", pIp_adapter_info->Address[i]);
					MAC_address.append(buffer);
					MAC_address.append("-");
				}
				else
				{
					sprintf_s(buffer,kMaxInfoBuffer, "%02X", pIp_adapter_info->Address[i]);
					MAC_address.append(buffer);
					adapter_info.append("\n");
				}

			IP_ADDR_STRING *pIp_addr_string =&(pIp_adapter_info->IpAddressList);
			do 
			{
				IP.append("IPAddr:");
				IP.append(pIp_addr_string->IpAddress.String);;
				IP.append("\nIpMask:");
				IP.append(pIp_addr_string->IpMask.String);
				IP.append("\nGateway:");
				IP.append(pIp_adapter_info->GatewayList.IpAddress.String);
				IP.append("\n");
				pIp_addr_string=pIp_addr_string->Next;
			} while (pIp_addr_string);
			adapter_info.append("\n");
			pIp_adapter_info = pIp_adapter_info->Next;
		}

	}
	if (pIp_adapter_info)
	{
		delete pIp_adapter_info;
		pIp_adapter_info = nullptr;
	}
}

const std::string GetCpuInfo()
{
	std::string processor_name("");
	LPCWSTR  str_path=L"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0";
	HKEY key;
	if (::RegOpenKeyEx(HKEY_LOCAL_MACHINE,str_path,0,KEY_ALL_ACCESS,&key) == ERROR_SUCCESS)
	{
		char processor_value[256];
		DWORD type = REG_SZ;
		DWORD value_size = sizeof(processor_value);	
		if (::RegQueryValueEx(key,L"ProcessorNameString", 0, &type, (LPBYTE)&processor_value, &value_size) == ERROR_SUCCESS)
			processor_name.append(processor_value,value_size);
		RegCloseKey(key);
		
	}
	return processor_name;
}

const std::string  GetDisplayCardinfo()
{
	std::string memory_info("");
	return memory_info;
}

包含頭或者庫

#include "WMIInfo.h"
#include <sstream>
#include "CharsetConversion.h"
#include <WinSock2.h>
#include "string"
#pragma comment(lib,"Iphlpapi.lib")

字符集轉換

CharsetConversion
#ifndef CHARSETCONVERSION_H_
#define CHARSETCONVERSION_H_
#include <string>
std::wstring  StringToWString(const std::string &str);
std::string WStringToString(const std::wstring &wstr);
std::string UnicodeToUTF8( const std::wstring& wstr );
std::wstring UTF8ToUnicode( const std::string& str );
std::string ws2s(const std::wstring& ws);
std::wstring s2ws(const std::string& s);
#endif

#include "StdAfx.h"
#include "CharsetConversion.h"
#include <Windows.h>
std::wstring  StringToWString(const std::string &str)
{    
	std::wstring wstr;
	int nLen = (int)str.length();    
	wstr.resize(nLen,L' ');

	int nResult = MultiByteToWideChar(CP_ACP,0,(LPCSTR)str.c_str(),nLen,(LPWSTR)wstr.c_str(),nLen);

	if (nResult == 0)
	{
		return std::wstring(L"");
	}
	return wstr;
}
//wstring高位元組不為0,返回FALSE
std::string WStringToString(const std::wstring &wstr)
{    
	std::string str;
	int nLen = (int)wstr.length();    
	str.resize(nLen,' ');

	int nResult = WideCharToMultiByte(CP_ACP,0,(LPCWSTR)wstr.c_str(),nLen,(LPSTR)str.c_str(),nLen,NULL,NULL);

	if (nResult == 0)
	{
		return std::string("");
	}
	return str;

}
std::string UnicodeToUTF8( const std::wstring& wstr )
{
	char*     pElementText;
	int    iTextLen;
	// wide char to multi char
	iTextLen = WideCharToMultiByte( CP_UTF8,
		0,
		wstr.c_str(),
		-1,
		NULL,
		0,
		NULL,
		NULL );
	pElementText = new char[iTextLen + 1];
	memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1 ) );
	::WideCharToMultiByte( CP_UTF8,
		0,
		wstr.c_str(),
		-1,
		pElementText,
		iTextLen,
		NULL,
		NULL );
	std::string str;
	str = pElementText;
	delete[] pElementText;
	return str;
}
std::wstring UTF8ToUnicode( const std::string& str )
{
	int  len = 0;
	len = str.length();
	int  unicodeLen = ::MultiByteToWideChar( CP_UTF8,
		0,
		str.c_str(),
		-1,
		NULL,
		0 ); 
	wchar_t *  pUnicode; 
	pUnicode = new  wchar_t[unicodeLen+1]; 
	memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t)); 
	::MultiByteToWideChar( CP_UTF8,
		0,
		str.c_str(),
		-1,
		(LPWSTR)pUnicode,
		unicodeLen ); 
	std::wstring  wstr; 
	wstr = ( wchar_t* )pUnicode;
	delete  pUnicode;
	return  wstr; 
}


std::string ws2s(const std::wstring& ws)
{
	std::string curLocale = setlocale(LC_ALL, NULL); // curLocale = "C";
	setlocale(LC_ALL, "chs");
	const wchar_t* _Source = ws.c_str();
	size_t _Dsize = 2 * ws.size() + 1;
	char *_Dest = new char[_Dsize];
	memset(_Dest,0,_Dsize);
//	wcstombs(_Dest,_Source,_Dsize);
	size_t   i;
	wcstombs_s(&i, _Dest, _Dsize, _Source, _Dsize);
	std::string result = _Dest;
	delete []_Dest;
	setlocale(LC_ALL, curLocale.c_str());
	return result;
}
std::wstring s2ws(const std::string& s)
{
	setlocale(LC_ALL, "chs");
	const char* _Source = s.c_str();
	size_t _Dsize = s.size() + 1;
	wchar_t *_Dest = new wchar_t[_Dsize];
	wmemset(_Dest, 0, _Dsize);
	//mbstowcs(_Dest,_Source,_Dsize);
	size_t   i;
	mbstowcs_s(&i, _Dest, _Dsize, _Source,_Dsize);
	std::wstring result = _Dest;
	delete []_Dest;
	setlocale(LC_ALL, "C");
	return result;
}