获取操作系统的详细信息--代码实现

1、GetVersionExA的使用

OSVERSIONINFO 结构体获取

头文件:#include

OSVERSIONINFO osvi;
ZeroMemory(osvi, sizeof(OSVERSIONINFO));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx((OSVERSIONINFO *)&osvi);

然后根据获取的主版本,次版本

最后给出获取OS的代码,没有单独试过是不是可以获取win10版本信息,修改后的确可以

BOOL ClassName::SetOperateSystemTypeAndCoreVersion()
{	
	TCHAR				pszOS[256+1] = {0};
	TCHAR				pszOSCore[64] = {0};
	UINT				uBufSize = 256;
	OSVERSIONINFOEX		osvi;
	SYSTEM_INFO			si;
	PGNSI				pGNSI;
	PGPI				pGPI;
	BOOL				bOsVersionInfoEx;
	DWORD				dwType;

	ZeroMemory(&si, sizeof(SYSTEM_INFO));
	ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));

	osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
	bOsVersionInfoEx = GetVersionEx((OSVERSIONINFO*) &osvi);

	if (! bOsVersionInfoEx)
	{
		return FALSE;
	}

	pGNSI = (PGNSI) GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")),"GetNativeSystemInfo");

	if (NULL != pGNSI)
	{
		pGNSI(&si);
	}
	else 
	{
		GetSystemInfo(&si);
	}

	if (VER_PLATFORM_WIN32_NT==osvi.dwPlatformId && osvi.dwMajorVersion > 4)
	{
		StringCchCopy(pszOS, uBufSize, TEXT("Microsoft "));
		if (osvi.dwMajorVersion >= 6)
		{   // after Windows 8.1 or later, GetVersionEx function cannot get correct version...
			OSVERSIONINFOEXW ovi;
			ZeroMemory(&ovi, sizeof(OSVERSIONINFOEXW));
			if (!GetVersionEx2((LPOSVERSIONINFOW)&ovi)) return FALSE;
			// GetVersionEx2/RtlGetVersion cannot get correct wProductType, so copy it to osvi
			osvi.dwMajorVersion = ovi.dwMajorVersion;
			osvi.dwMinorVersion = ovi.dwMinorVersion;
			osvi.dwBuildNumber  = ovi.dwBuildNumber;
			//_tprintf(TEXT("RtlGetVersion=%d.%d.%d\n"), osvi.dwMajorVersion, osvi.dwMinorVersion, osvi.dwBuildNumber); //output version info directly
		}
		
		LogPrint::PrintLogA("osvi.dwMajorVersion === %d",osvi.dwMajorVersion);
		LogPrint::PrintLogA("osvi.dwMinorVersion ===  :%d",osvi.dwMinorVersion);
		
		if (osvi.dwMajorVersion > 6)
		{
			if ( osvi.dwMajorVersion > 10 || osvi.dwMinorVersion > 0 )
			{
				//Reserve  for new OS
				StringCchCat(pszOS, uBufSize, TEXT("Windows 10 Later ")); 
			}
			else
			{
				if( osvi.wProductType == VER_NT_WORKSTATION )
					StringCchCat(pszOS, uBufSize, TEXT("Windows 10 "));
				else
					StringCchCat(pszOS, uBufSize, TEXT("Windows Server 2016 " ));
			}

		}
		else if (osvi.dwMajorVersion == 6)
		{
			StringCchCopy(pszOSCore,64,TEXT("6"));

			if (osvi.dwMinorVersion == 0)
			{
				StringCchCat(pszOSCore,64,TEXT(".0"));
				if(osvi.wProductType == VER_NT_WORKSTATION)
				{
					StringCchCat(pszOS, uBufSize, TEXT("Windows Vista "));
				}
				else 
				{
					StringCchCat(pszOS, uBufSize, TEXT("Windows Server 2008 " ));
				}
			}
			else if (osvi.dwMinorVersion == 1 )
			{
				StringCchCat(pszOSCore,64,TEXT(".1"));
				if (osvi.wProductType == VER_NT_WORKSTATION)
				{
					StringCchCat(pszOS, uBufSize, TEXT("Windows 7 "));
				}
				else
				{
					StringCchCat(pszOS, uBufSize, TEXT("Windows Server 2008 R2 " ));
				}
			} 
			else if(osvi.dwMinorVersion == 2)
			{
				StringCchCat(pszOSCore,64,TEXT(".2"));
				 if (osvi.wProductType == VER_NT_WORKSTATION)
				{
					StringCchCat(pszOS, uBufSize, TEXT("Windows 8 "));
				}
				 else
				 {
					 StringCchCat(pszOS, uBufSize, TEXT("Windows Server 2012"));
				 }
			}	
			else if (osvi.dwMinorVersion == 3)
			{
				StringCchCat(pszOSCore,64,TEXT(".3"));
				if (osvi.wProductType == VER_NT_WORKSTATION )
				{
					StringCchCat(pszOS, uBufSize, TEXT("Windows 8.1"));
				}
				else
				{
					StringCchCat(pszOS, uBufSize, TEXT("Windows Server 2012 R2"));
				}
			}
			pGPI = (PGPI) GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetProductInfo");

			pGPI(osvi.dwMajorVersion, osvi.dwMinorVersion, 0, 0, &dwType);

			switch(dwType)
			{
			case PRODUCT_ULTIMATE:
				StringCchCat(pszOS, uBufSize, TEXT("Ultimate Edition"));
				break;
			case PRODUCT_PROFESSIONAL:
				StringCchCat(pszOS, uBufSize, TEXT("Professional"));
				break;
			case PRODUCT_HOME_PREMIUM:
				StringCchCat(pszOS, uBufSize, TEXT("Home Premium Edition"));
				break;
			case PRODUCT_HOME_BASIC:
				StringCchCat(pszOS, uBufSize, TEXT("Home Basic Edition"));
				break;
			case PRODUCT_ENTERPRISE:
				StringCchCat(pszOS, uBufSize, TEXT("Enterprise Edition"));
				break;
			case PRODUCT_BUSINESS:
				StringCchCat(pszOS, uBufSize, TEXT("Business Edition"));
				break;
			case PRODUCT_STARTER:
				StringCchCat(pszOS, uBufSize, TEXT("Starter Edition"));
				break;
			case PRODUCT_CLUSTER_SERVER:
				StringCchCat(pszOS, uBufSize, TEXT("Cluster Server Edition"));
				break;
			case PRODUCT_DATACENTER_SERVER:
				StringCchCat(pszOS, uBufSize, TEXT("Datacenter Edition"));
				break;
			case PRODUCT_DATACENTER_SERVER_CORE:
				StringCchCat(pszOS, uBufSize, TEXT("Datacenter Edition (core installation)"));
				break;
			case PRODUCT_ENTERPRISE_SERVER:
				StringCchCat(pszOS, uBufSize, TEXT("Enterprise Edition" ));
				break;
			case PRODUCT_ENTERPRISE_SERVER_CORE:
				StringCchCat(pszOS, uBufSize, TEXT("Enterprise Edition (core installation)"));
				break;
			case PRODUCT_ENTERPRISE_SERVER_IA64:
				StringCchCat(pszOS, uBufSize, TEXT("Enterprise Edition for Itanium-based Systems"));
				break;
			case PRODUCT_SMALLBUSINESS_SERVER:
				StringCchCat(pszOS, uBufSize, TEXT("Small Business Server"));
				break;
			case PRODUCT_SMALLBUSINESS_SERVER_PREMIUM:
				StringCchCat(pszOS, uBufSize, TEXT("Small Business Server Premium Edition"));
				break;
			case PRODUCT_STANDARD_SERVER:
				StringCchCat(pszOS, uBufSize, TEXT("Standard Edition"));
				break;
			case PRODUCT_STANDARD_SERVER_CORE:
				StringCchCat(pszOS, uBufSize, TEXT("Standard Edition (core installation)"));
				break;
			case PRODUCT_WEB_SERVER:
				StringCchCat(pszOS, uBufSize, TEXT("Web Server Edition"));
				break;
			}
		}
		else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2)
		{
			StringCchCopy(pszOSCore,64,TEXT("5"));
			StringCchCat(pszOSCore,64,TEXT(".2"));

			if(GetSystemMetrics(SM_SERVERR2))
			{
				StringCchCat(pszOS, uBufSize, TEXT( "Windows Server 2003 R2, "));
			}
			else if (osvi.wSuiteMask & VER_SUITE_STORAGE_SERVER)
			{
				StringCchCat(pszOS, uBufSize, TEXT( "Windows Storage Server 2003"));
			}
			else if (osvi.wSuiteMask & VER_SUITE_WH_SERVER)
			{
				StringCchCat(pszOS, uBufSize, TEXT( "Windows Home Server"));
			}
			else if(osvi.wProductType == VER_NT_WORKSTATION &&
				si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)
			{
				StringCchCat(pszOS, uBufSize, TEXT("Windows XP Professional x64 Edition"));
			}
			else 
			{
				StringCchCat(pszOS, uBufSize, TEXT("Windows Server 2003, "));
			}

			if (osvi.wProductType != VER_NT_WORKSTATION)
			{
				if (si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_IA64)
				{
					if(osvi.wSuiteMask & VER_SUITE_DATACENTER)
					{
						StringCchCat(pszOS, uBufSize, TEXT("Datacenter Edition for Itanium-based Systems"));
					}
					else if(osvi.wSuiteMask & VER_SUITE_ENTERPRISE)
					{
						StringCchCat(pszOS, uBufSize, TEXT("Enterprise Edition for Itanium-based Systems"));
					}
				}
				else if (si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)
				{
					if(osvi.wSuiteMask & VER_SUITE_DATACENTER)
					{
						StringCchCat(pszOS, uBufSize, TEXT("Datacenter x64 Edition"));
					}
					else if(osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
					{
						StringCchCat(pszOS, uBufSize, TEXT("Enterprise x64 Edition"));
					}
					else 
					{
						StringCchCat(pszOS, uBufSize, TEXT("Standard x64 Edition"));
					}
				}
				else
				{
					if (osvi.wSuiteMask & VER_SUITE_COMPUTE_SERVER)
					{
						StringCchCat(pszOS, uBufSize, TEXT("Compute Cluster Edition"));
					}
					else if(osvi.wSuiteMask & VER_SUITE_DATACENTER)
					{
						StringCchCat(pszOS, uBufSize, TEXT("Datacenter Edition"));
					}
					else if(osvi.wSuiteMask & VER_SUITE_ENTERPRISE)
					{
						StringCchCat(pszOS, uBufSize, TEXT("Enterprise Edition"));
					}
					else if (osvi.wSuiteMask & VER_SUITE_BLADE)
					{
						StringCchCat(pszOS, uBufSize, TEXT("Web Edition"));
					}
					else 
					{
						StringCchCat(pszOS, uBufSize, TEXT("Standard Edition"));
					}
				}
			}
		}
		else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1)
		{
			StringCchCopy(pszOSCore, 64, TEXT("5.1"));

			StringCchCat(pszOS, uBufSize, TEXT("Windows XP "));
			if(osvi.wSuiteMask & VER_SUITE_PERSONAL)
			{
				StringCchCat(pszOS, uBufSize, TEXT("Home Edition"));
			}
			else 
			{
				StringCchCat(pszOS, uBufSize, TEXT( "Professional"));
			}
		}
		else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0)
		{
			StringCchCat(pszOS, uBufSize, TEXT("Windows 2000 "));

			StringCchCopy(pszOSCore, 64, TEXT("5.0"));

			if ( osvi.wProductType == VER_NT_WORKSTATION )
			{
				StringCchCat(pszOS, uBufSize, TEXT("Professional"));
			}
			else 
			{
				if(osvi.wSuiteMask & VER_SUITE_DATACENTER)
				{
					StringCchCat(pszOS, uBufSize, TEXT("Datacenter Server"));
				}
				else if(osvi.wSuiteMask & VER_SUITE_ENTERPRISE)
				{
					StringCchCat(pszOS, uBufSize, TEXT("Advanced Server"));
				}
				else 
				{
					StringCchCat(pszOS, uBufSize, TEXT("Server"));
				}
			}
		}


		if(_tcslen(osvi.szCSDVersion) > 0)
		{
			StringCchCat(pszOS, uBufSize, TEXT(" "));
			StringCchCat(pszOS, uBufSize, osvi.szCSDVersion);
		}

		TCHAR bufCore[64];
		
		StringCchPrintf(bufCore, 64, TEXT("%d"), osvi.dwBuildNumber);

		StringCchCat(pszOSCore, 64, TEXT("."));
		StringCchCat(pszOSCore, 64, bufCore);
	
		m_strOStype =global::WCharToMultiChar(pszOS);
		m_strOSCoreType = global::WCharToMultiChar(pszOSCore);

		return TRUE; 
	}
	else
	{  
		return FALSE;
	}
}

 

你可能感兴趣的:(C++)