zoukankan      html  css  js  c++  java
  • vc++ windows获取计算机信息

    在软件开发中,我们经常要获当前系统的版本号,判断当前是什么系统,获取获取物理内存和可用内存大小,获取CPU名称、内核数目、主频,获取MAC地址,获取屏幕分辨率,下面的这个c++类将包含所有这些信息。

    #pragma once
    #include <string>
    class CWinVersion
    {
    public:
    	CWinVersion(void);
    	~CWinVersion(void);
    
    	BOOL CheckNTVersion();
    
    	BOOL CheckVistaVersion();
    
    	BOOL GetMajorVersion(DWORD& dwMajorVersion);
    	BOOL GetMinorVersion(DWORD& dwMinorVersion);
    
    	BOOL GetPackVersion(LPTSTR lpVersion);
    
    	BOOL GetServicePackVersion(DWORD& dwVersion);
    
    	BOOL IsWow64();
    
    	BOOL IsWorkStation();
    	///获取系统信息
    	std::wstring GetOsVerDetail();
    	/********获取操作系统版本,Service pack版本、系统类型************/
    	void GetOSVersion(std::wstring &strOSVersion, std::wstring &strServiceVersion);
    	/***获取物理内存和可用内存大小***/
    	void GetMemoryInfo(DWORD &dwTotalPhys, DWORD &dwAvailPhys);
    	/****获取CPU名称、内核数目、主频*******/
    	void GetCpuInfo(std::wstring &chProcessorName, std::wstring &chProcessorType, DWORD &dwNum, DWORD &dwMaxClockSpeed);
    	//获取MAC地址
    	std::wstring GetMacAddress();
    	////获取屏幕分辨率
    	void GetXYScreen(int &xScreen, int &yScreen);
    private:
    	BOOL OpenVersion();
    
    private:
    	OSVERSIONINFOEX m_osvi;
    	BOOL m_bOpened;
    };
    

      

    #include "stdafx.h"
    
    #include <strsafe.h>
    #include <atlbase.h>
    #include "winversion.h"
    #include "Winbase.h"
    #include <Iphlpapi.h>
    #pragma warning(disable:4996)
    #pragma comment(lib,"Iphlpapi.lib")
    CWinVersion::CWinVersion(void)
    : m_bOpened(FALSE)
    {
    }
    
    CWinVersion::~CWinVersion(void)
    {
    }
    
    BOOL CWinVersion::CheckNTVersion()
    {
    	if (!OpenVersion())
    		return FALSE;
    
    	if (m_osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
    	{
    		if (m_osvi.dwMajorVersion >= 5)
    		{
    			return TRUE;
    		}
    	}
    
    	return FALSE;
    }
    
    BOOL CWinVersion::CheckVistaVersion()
    {
    	if (!OpenVersion())
    		return FALSE;
    
    	if (m_osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
    	{
    		if (m_osvi.dwMajorVersion == 6 && m_osvi.dwMinorVersion == 0)
    		{
    			return TRUE;
    		}
    	}
    
    	return FALSE;
    }
    
    BOOL CWinVersion::GetMajorVersion(DWORD& dwMajorVersion)
    {
    	if (!OpenVersion())
    		return FALSE;
    
    	dwMajorVersion = m_osvi.dwMajorVersion;
    
    	return TRUE;
    }
    
    BOOL CWinVersion::GetMinorVersion(DWORD& dwMinorVersion)
    {
    	if (!OpenVersion())
    		return FALSE;
    
    	dwMinorVersion = m_osvi.dwMinorVersion;
    
    	return TRUE;
    }
    
    BOOL CWinVersion::GetPackVersion(LPTSTR lpVersion)
    {
    	if (!OpenVersion())
    		return FALSE;
    
    	StringCchCopy(lpVersion, MAX_PATH, m_osvi.szCSDVersion);
    
    	return TRUE;
    }
    
    BOOL CWinVersion::GetServicePackVersion(DWORD& dwVersion)
    {
    	if (!OpenVersion())
    		return FALSE;
    
    	dwVersion = m_osvi.wServicePackMajor;
    	return TRUE;
    }
    
    BOOL CWinVersion::OpenVersion()
    {
    	if (!m_bOpened)
    	{
    		ZeroMemory(&m_osvi, sizeof(OSVERSIONINFOEX));
    		m_osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
    
    		if (!(GetVersionEx((OSVERSIONINFO *)&m_osvi)))
    		{
    			// If OSVERSIONINFOEX doesn't work,try OSVERSIONINFO.
    			m_osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    
    			if (!GetVersionEx((OSVERSIONINFO *)&m_osvi))
    			{
    				return FALSE;
    			}
    		}
    
    		m_bOpened = TRUE;
    	}
    
    	return TRUE;
    }
    
    //判断是否x64系统
    
    BOOL CWinVersion::IsWow64()
    {
    	typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); 
    	LPFN_ISWOW64PROCESS fnIsWow64Process; 
    	BOOL bIsWow64 = FALSE; 
    	fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress( GetModuleHandle(_T("kernel32")),"IsWow64Process"); 
    	if (NULL != fnIsWow64Process) 
    	{ 
    		fnIsWow64Process(GetCurrentProcess(),&bIsWow64);
    	} 
    	return bIsWow64; 
    }
    
    BOOL CWinVersion::IsWorkStation()
    {
    	if (!OpenVersion())
    		return FALSE;
    
    	return (m_osvi.wProductType == VER_NT_WORKSTATION) ? TRUE : FALSE;
    }
    
    std::wstring CWinVersion::GetOsVerDetail()
    {
    	OSVERSIONINFO  osvi;
    	ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
    	osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    	GetVersionEx(&osvi);
    	std::wstring strVer = _T("");
    	if (osvi.dwPlatformId == 2)
    	{
    		//VER_PLATFORM_WIN32_NT windows 平台
    		if (osvi.dwMajorVersion == 6)
    		{
    			switch (osvi.dwMinorVersion)
    			{
    			case 3:
    				//Windows 8.1
    				strVer += _T("Windows 8.1");
    				break;
    			case 2:
    				strVer += _T("Windows 8");
    				break;
    			case 1:
    				strVer += _T("Windows 7");
    				break;
    			case 0:
    				strVer += _T("Windows Vista");
    				break;
    			default:
    				break;
    			}
    		}
    		else if (osvi.dwMajorVersion == 5)
    		{
    			switch (osvi.dwMinorVersion)
    			{
    			case 2:
    				if (GetSystemMetrics(SM_SERVERR2) != 0)
    					strVer += _T("Windows Server 2003 R2");
    				else
    					strVer += _T("Windows Server 2003");
    				break;
    			case 1:
    				strVer += _T("Windows XP");
    				break;
    			case 0:
    				strVer += _T("Windows 2000");
    				break;
    			default:
    				break;
    			}
    		}
    
    		TCHAR strbuild[20];
    		StringCchPrintf(strbuild,20, _T(" Build:%d "), osvi.dwBuildNumber);
    		strVer += strbuild;
    		strVer += osvi.szCSDVersion;
    		return strVer;
    	}
    	else
    	{
    		return _T("");
    	}
    }
    		
    
    void CWinVersion::GetOSVersion(std::wstring &strOSVersion, std::wstring &strServiceVersion)
    {
    	std::wstring str;
    	OSVERSIONINFOEX osvi;
    	SYSTEM_INFO si;
    	BOOL bOsVersionInfoEx;
    
    	ZeroMemory(&si, sizeof(SYSTEM_INFO));
    	ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
    
    	osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
    	if (!(bOsVersionInfoEx = GetVersionEx((OSVERSIONINFO *)&osvi)))
    	{
    		osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    		GetVersionEx((OSVERSIONINFO *)&osvi);
    	}
    
    
    	GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")),
    		"GetNativeSystemInfo");
    
    	GetSystemInfo(&si);
    	switch (osvi.dwPlatformId)
    	{
    	case VER_PLATFORM_WIN32_NT:
    		if (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0)
    		{
    			if (osvi.wProductType == VER_NT_WORKSTATION)
    			{
    				str = _T("Windows Vista ");
    			}
    			else
    			{
    				str = _T("Windows Server "Longhorn" ");
    			}
    		}
    		if (osvi.dwMajorVersion == 6)
    		{
    			switch (osvi.dwMinorVersion !=0 )
    			{
    			case 3:
    				//Windows 8.1
    				str += _T("Windows 8.1");
    				break;
    			case 2:
    				str += _T("Windows 8");
    				break;
    			case 1:
    				str += _T("Windows 7");
    				break;
    			case 0:
    				
    				break;
    			default:
    				break;
    			}
    		}
    		else if (osvi.dwMajorVersion == 10)
    		{
    			str += _T("Windows 10");
    		}
    		if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2)
    		{
    			if (GetSystemMetrics(SM_SERVERR2))
    			{
    				str = _T("Microsoft Windows Server 2003 "R2" ");
    			}
    			else if (osvi.wProductType == VER_NT_WORKSTATION &&
    				si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
    			{
    				str = _T("Microsoft Windows XP Professional x64 Edition ");
    			}
    			else
    			{
    				str = _T("Microsoft Windows Server 2003, ");
    			}
    		}
    
    		if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1)
    		{
    			str = _T("Microsoft Windows XP ");
    		}
    
    		if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0)
    			str = _T("Microsoft Windows 2000 ");
    
    		if (osvi.dwMajorVersion <= 4)
    		{
    			str = _T("Microsoft Windows NT ");
    		}
    
    		// Test for specific product on Windows NT 4.0 SP6 and later.
    		if (bOsVersionInfoEx)
    		{
    			//将Service Pack 版本保存
    			TCHAR temp[100] = { 0 };
    			StringCchPrintf(temp, 100, _T(" Service Pack %d "), osvi.wServicePackMajor);
    			strServiceVersion = temp;
    			// Test for the workstation type.
    			if (osvi.wProductType == VER_NT_WORKSTATION &&
    				si.wProcessorArchitecture != PROCESSOR_ARCHITECTURE_AMD64)
    			{
    				if (osvi.dwMajorVersion == 4)
    					str = str + _T("Workstation 4.0");
    				else if (osvi.wSuiteMask & VER_SUITE_PERSONAL)
    					str = str + _T("Home Edition");
    				else str = str + _T("Professional");
    			}
    
    			// Test for the server type.
    			else if (osvi.wProductType == VER_NT_SERVER ||
    				osvi.wProductType == VER_NT_DOMAIN_CONTROLLER)
    			{
    				if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2)
    				{
    					if (si.wProcessorArchitecture ==
    						PROCESSOR_ARCHITECTURE_IA64)
    					{
    						if (osvi.wSuiteMask & VER_SUITE_DATACENTER)
    							str = str + _T("Datacenter Edition for Itanium-based Systems");
    						else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE)
    							str = str + _T("Enterprise Edition for Itanium-based Systems");
    					}
    
    					else if (si.wProcessorArchitecture ==
    						PROCESSOR_ARCHITECTURE_AMD64)
    					{
    						if (osvi.wSuiteMask & VER_SUITE_DATACENTER)
    							str = str + _T("Datacenter x64 Edition ");
    						else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE)
    							str = str + _T("Enterprise x64 Edition ");
    						else str = str + _T("Standard x64 Edition ");
    					}
    
    					else
    					{
    						if (osvi.wSuiteMask & VER_SUITE_DATACENTER)
    							str = str + _T("Datacenter Edition ");
    						else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE)
    							str = str + _T("Enterprise Edition ");
    						else if (osvi.wSuiteMask & VER_SUITE_BLADE)
    							str = str + _T("Web Edition ");
    						else str = str + _T("Standard Edition ");
    					}
    				}
    				else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0)
    				{
    					if (osvi.wSuiteMask & VER_SUITE_DATACENTER)
    						str = str + _T("Datacenter Server ");
    					else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE)
    						str = str + _T("Advanced Server ");
    					else str = str + _T("Server ");
    				}
    				else  // Windows NT 4.0 
    				{
    					if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE)
    						str = str + _T("Server 4.0, Enterprise Edition ");
    					else str = str + _T("Server 4.0 ");
    				}
    			}
    		}
    		// Test for specific product on Windows NT 4.0 SP5 and earlier
    		else
    		{
    			HKEY hKey;
    			TCHAR szProductType[256];
    			DWORD dwBufLen = 256 * sizeof(TCHAR);
    			LONG lRet;
    
    			lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
    				_T("SYSTEM\CurrentControlSet\Control\ProductOptions"), 0, KEY_QUERY_VALUE, &hKey);
    			if (lRet != ERROR_SUCCESS)
    				strOSVersion = str;
    			return;
    
    			lRet = RegQueryValueEx(hKey, TEXT("ProductType"),
    				NULL, NULL, (LPBYTE)szProductType, &dwBufLen);
    			RegCloseKey(hKey);
    
    			if ((lRet != ERROR_SUCCESS) ||
    				(dwBufLen > 256 * sizeof(TCHAR)))
    				strOSVersion = str;
    			return;
    
    			if (lstrcmpi(TEXT("WINNT"), szProductType) == 0)
    				str = str + _T("Workstation ");
    			if (lstrcmpi(TEXT("LANMANNT"), szProductType) == 0)
    				str = str + _T("Server ");
    			if (lstrcmpi(TEXT("SERVERNT"), szProductType) == 0)
    				str = str + _T("Advanced Server ");
    
    			TCHAR temp[100] = { 0 };
    			StringCchPrintf(temp, 100, _T("%d.%d"),  osvi.dwMajorVersion, osvi.dwMinorVersion);
    			str = temp;
    		}
    
    		// Display service pack (if any) and build number.
    
    		if (osvi.dwMajorVersion == 4 &&
    			lstrcmpi(osvi.szCSDVersion, TEXT("Service Pack 6")) == 0)
    		{
    			HKEY hKey;
    			LONG lRet;
    
    			// Test for SP6 versus SP6a.
    			lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
    				_T("SOFTWARE\Microsoft\Windows NT\CurrentVersion\Hotfix\Q246009"), 0, KEY_QUERY_VALUE, &hKey);
    			if (lRet == ERROR_SUCCESS)
    			{
    				TCHAR temp[100] = { 0 };
    				StringCchPrintf(temp, 100, _T("ervice Pack 6a (Build %d)
    "), osvi.dwBuildNumber & 0xFFFF);
    				str = temp;
    			}
    			else // Windows NT 4.0 prior to SP6a
    			{
    				_tprintf(TEXT("%s (Build %d)
    "), osvi.szCSDVersion, osvi.dwBuildNumber & 0xFFFF);
    			}
    
    			RegCloseKey(hKey);
    		}
    		else // not Windows NT 4.0 
    		{
    			_tprintf(TEXT("%s (Build %d)
    "), osvi.szCSDVersion, osvi.dwBuildNumber & 0xFFFF);
    		}
    
    		break;
    
    		// Test for the Windows Me/98/95.
    	case VER_PLATFORM_WIN32_WINDOWS:
    
    		if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0)
    		{
    			str = _T("Microsoft Windows 95 ");
    			if (osvi.szCSDVersion[1] == 'C' || osvi.szCSDVersion[1] == 'B')
    				str = str + _T("OSR2 ");
    		}
    
    		if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10)
    		{
    			str = _T("Microsoft Windows 98 ");
    			if (osvi.szCSDVersion[1] == 'A' || osvi.szCSDVersion[1] == 'B')
    				str = str + _T("SE ");
    		}
    		if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90)
    		{
    			str = _T("Microsoft Windows Millennium Edition
    ");
    		}
    		break;
    
    	case VER_PLATFORM_WIN32s:
    		str = _T("Microsoft Win32s
    ");
    		break;
    	default:
    		break;
    	}
    
    	strOSVersion = str;
    }
    
    void CWinVersion::GetCpuInfo(std::wstring &chProcessorName, std::wstring &chProcessorType, DWORD &dwNum, DWORD &dwMaxClockSpeed)
    {
    
    	std::wstring strPath = _T("HARDWARE\DESCRIPTION\System\CentralProcessor\0");//注册表子键路径HKEY_LOCAL_MACHINEHARDWAREDESCRIPTIONSystemCentralProcessor
    	CRegKey regkey;//定义注册表类对象
    	LONG lResult;//LONG型变量-反应结果
    	lResult = regkey.Open(HKEY_LOCAL_MACHINE, strPath.c_str(), KEY_READ); //打开注册表键
    	if (lResult != ERROR_SUCCESS)
    	{
    		return;
    	}
    	TCHAR chCPUName[50] = { 0 };
    	DWORD dwSize = 50;
    
    	//获取ProcessorNameString字段值
    	if (ERROR_SUCCESS == regkey.QueryStringValue(_T("ProcessorNameString"), chCPUName, &dwSize))
    	{
    		chProcessorName = chCPUName;
    	}
    
    	//查询CPU主频
    	DWORD dwValue;
    	if (ERROR_SUCCESS == regkey.QueryDWORDValue(_T("~MHz"), dwValue))
    	{
    		dwMaxClockSpeed = dwValue;
    	}
    	regkey.Close();//关闭注册表
    	//UpdateData(FALSE);
    
    	//获取CPU核心数目
    	SYSTEM_INFO si;
    	memset(&si, 0, sizeof(SYSTEM_INFO));
    	GetSystemInfo(&si);
    	dwNum = si.dwNumberOfProcessors;
    
    	switch (si.dwProcessorType)
    	{
    	case PROCESSOR_INTEL_386:
    	{
    		chProcessorType = _T("Intel 386 processor");
    	}
    	break;
    	case PROCESSOR_INTEL_486:
    	{
    		chProcessorType = _T("Intel 486 Processor");
    	}
    	break;
    	case PROCESSOR_INTEL_PENTIUM:
    	{
    		chProcessorType = _T("Intel Pentium Processor");
    	}
    	break;
    	case PROCESSOR_INTEL_IA64:
    	{
    		chProcessorType = _T("Intel IA64 Processor");
    	}
    	break;
    	case PROCESSOR_AMD_X8664:
    	{
    		chProcessorType = _T("AMD X8664 Processor");
    	}
    	break;
    	default:
    		chProcessorType = _T("未知");
    		break;
    	}
    }
    
    void  CWinVersion::GetMemoryInfo(DWORD &dwTotalPhys, DWORD &dwAvailPhys)
    {
    	MEMORYSTATUS   Mem;
    	GlobalMemoryStatus(&Mem);
    	dwTotalPhys = (DWORD)Mem.dwTotalPhys / (1024 * 1024);
    	dwAvailPhys = (DWORD)Mem.dwAvailPhys / (1024 * 1024);
    }
    
    std::wstring CWinVersion::GetMacAddress()
    {
    	std::wstring strMac = _T("");
    	PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();
    	unsigned long stSize = sizeof(IP_ADAPTER_INFO);
    	//调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量
    	int nRel = GetAdaptersInfo(pIpAdapterInfo, &stSize);
    	if (ERROR_BUFFER_OVERFLOW == nRel)
    	{
    		if (pIpAdapterInfo != NULL)
    		{
    			delete pIpAdapterInfo;
    			pIpAdapterInfo = NULL;
    		}
    		pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];
    		nRel = GetAdaptersInfo(pIpAdapterInfo, &stSize);
    	}
    	TCHAR szMac[MAX_PATH] = { 0 };
    	if (ERROR_SUCCESS == nRel)
    	{
    		//输出网卡信息
    		StringCchPrintf(szMac, sizeof(szMac), _T("%02X%02X%02X%02X%02X%02X"), pIpAdapterInfo->Address[0], pIpAdapterInfo->Address[1], pIpAdapterInfo->Address[2], pIpAdapterInfo->Address[3], pIpAdapterInfo->Address[4], pIpAdapterInfo->Address[5]);
    	}
    	//释放内存空间
    	if (pIpAdapterInfo != NULL)
    	{
    		delete []pIpAdapterInfo;
    	}
    	strMac = szMac;
    	return strMac;
    }
    
    void CWinVersion::GetXYScreen(int &xScreen, int &yScreen)
    {
    	xScreen = GetSystemMetrics(SM_CXSCREEN);
    	yScreen = GetSystemMetrics(SM_CYSCREEN);
    }
    

      

  • 相关阅读:
    【UNR #1】火车管理
    NOIP2018保卫王国
    [SCOI2015]国旗计划[Wf2014]Surveillance
    [TJOI2015]线性代数(最小割)
    [AH2017/HNOI2017]礼物(FFT)
    BZOJ5093图的价值(斯特林数)
    [NOI2018]你的名字(后缀自动机+线段树)
    [SDOI2015]序列统计(多项式快速幂)
    [NOI2014]购票(斜率优化+线段树)
    [CQOI2017]小Q的表格(数论+分块)
  • 原文地址:https://www.cnblogs.com/snowbook/p/5363671.html
Copyright © 2011-2022 走看看