void CGetPCInfo::GetOS(string& os)
{
/*Windows 10 10.0* 10 0 OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION
Windows Server 2016 Technical Preview 10.0* 10 0 OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION
Windows 8.1 6.3* 6 3 OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION
Windows Server 2012 R2 6.3* 6 3 OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION
Windows 8 6.2 6 2 OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION
Windows Server 2012 6.2 6 2 OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION
Windows 7 6.1 6 1 OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION
Windows Server 2008 R2 6.1 6 1 OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION
Windows Server 2008 6.0 6 0 OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION
Windows Vista 6.0 6 0 OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION
Windows Server 2003 R2 5.2 5 2 GetSystemMetrics(SM_SERVERR2) != 0
Windows Server 2003 5.2 5 2 GetSystemMetrics(SM_SERVERR2) == 0
Windows XP 5.1 5 1 Not applicable
Windows 2000 5.0 5 0 Not applicable*/
OSVERSIONINFOEXA osvi;
BOOL bOsVersionInfoEx;
// Try calling GetVersionEx using the OSVERSIONINFOEX structure.
// If that fails, try using the OSVERSIONINFO structure.
ZeroMemory(&osvi, sizeof(OSVERSIONINFOEXA));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
if( !(bOsVersionInfoEx = GetVersionExA ((OSVERSIONINFOA *) &osvi)) )
{
osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFOA);
if (! GetVersionExA ( (OSVERSIONINFOA *) &osvi) )
return;
}
switch (osvi.dwPlatformId)
{
// Test for the Windows NT product family.
case VER_PLATFORM_WIN32_NT:
{
// Test for the specific product.
if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 )
os += "Windows Server 2003, ";
if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 )
os += "Windows XP ";
if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 )
os += "Windows 2000 ";
if ( osvi.dwMajorVersion <= 4 )
os += "Windows NT ";
// Test for specific product on Windows NT 4.0 SP6 and later.
if( bOsVersionInfoEx )
{
// Test for the workstation type.
if ( osvi.wProductType == VER_NT_WORKSTATION )
{
if( osvi.dwMajorVersion > 10 ) {
char szOs[80] = {0};
sprintf_s(szOs, 79, "Windows %d ", osvi.dwMajorVersion);
os += szOs;
} else if( osvi.dwMajorVersion == 10 )
os += "Windows 10 ";
else if( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion==3 )
os += "Windows 8.1 ";
else if( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion==2 )
os += "Windows 8 ";
else if( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion==1 )
os += "Windows 7 ";
else if( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion==0 )
os += "Windows Vista ";
else if( osvi.dwMajorVersion == 4 )
os += "Workstation 4.0 ";
else if( osvi.wSuiteMask & VER_SUITE_PERSONAL )
os += "Home Edition ";
else
os += "Professional ";
}
// Test for the server type.
else if ( osvi.wProductType == VER_NT_SERVER ||
osvi.wProductType == VER_NT_DOMAIN_CONTROLLER )
{
if( osvi.dwMajorVersion > 10 )
{
char szOs[80] = {0};
sprintf_s(szOs, 79, "Windows Server %d ", osvi.dwMajorVersion);
os += szOs;
} else if( osvi.dwMajorVersion == 10 )
os += "Windows Server 2016 Technical Preview ";
else if( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion==3 )
os += "Windows Server 2012 R2 ";
else if( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion==2 )
os += "Windows Server 2012 ";
else if( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion==1 )
os += "Windows Server 2008 R2 ";
else if( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion==0 )
os += "Windows Server 2008 ";
else if(osvi.dwMajorVersion==5 && osvi.dwMinorVersion==2)
{
if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
os += "Datacenter Edition ";
else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
os += "Enterprise Edition ";
else if ( osvi.wSuiteMask == VER_SUITE_BLADE )
os += "Web Edition ";
else
os += "Standard Edition ";
}
else if(osvi.dwMajorVersion==5 && osvi.dwMinorVersion==0)
{
if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
os += "Datacenter Server ";
else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
os += "Advanced Server ";
else
os += "Server ";
}
else // Windows NT 4.0
{
if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
os += "Server 4.0, Enterprise Edition ";
else
os += "Server 4.0 ";
}
}
}
// Test for specific product on Windows NT 4.0 SP5 and earlier
else
{
HKEY hKey = NULL;
char szProductType[80] = {0};
DWORD dwBufLen=80;
LONG lRet = 0;
lRet = RegOpenKeyExA( HKEY_LOCAL_MACHINE,
"SYSTEM\\CurrentControlSet\\Control\\ProductOptions",
0, KEY_QUERY_VALUE, &hKey );
if( lRet == ERROR_SUCCESS )
{
lRet = RegQueryValueExA( hKey, "ProductType", NULL, NULL,
(LPBYTE)szProductType, &dwBufLen);
szProductType[79] = 0;
RegCloseKey( hKey );
if ( lstrcmpiA( "WINNT", szProductType) == 0 )
os += "Workstation ";
if ( lstrcmpiA( "LANMANNT", szProductType) == 0 )
os += "Server ";
if ( lstrcmpiA( "SERVERNT", szProductType) == 0 )
os += "Advanced Server ";
}
}
// Display service pack (if any) and build number.
char szSrvPack[80] = {0};
if( osvi.dwMajorVersion == 4 &&
lstrcmpiA( osvi.szCSDVersion, "Service Pack 6" ) == 0 )
{
HKEY hKey = NULL;
LONG lRet = 0;
// Test for SP6 versus SP6a.
lRet = RegOpenKeyExA( HKEY_LOCAL_MACHINE,
"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Hotfix\\Q246009",
0, KEY_QUERY_VALUE, &hKey );
if( lRet == ERROR_SUCCESS )
sprintf_s( szSrvPack, 79, "Service Pack 6a (Build %d)", osvi.dwBuildNumber & 0xFFFF );
else // Windows NT 4.0 prior to SP6a
{
sprintf_s( szSrvPack, 79, "%s (Build %d)", osvi.szCSDVersion, osvi.dwBuildNumber & 0xFFFF);
}
RegCloseKey( hKey );
}
else // not Windows NT 4.0
{
sprintf_s( szSrvPack, 79, "%s (Build %d)", osvi.szCSDVersion, osvi.dwBuildNumber & 0xFFFF);
}
os += szSrvPack;
}
break;
// Test for the Windows Me/98/95.
case VER_PLATFORM_WIN32_WINDOWS:
{
if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0)
{
os += "Windows 95 ";
if (osvi.szCSDVersion[1]=='C' || osvi.szCSDVersion[1]=='B')
os += "OSR2 ";
}
if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10)
{
os += "Windows 98 ";
if ( osvi.szCSDVersion[1] == 'A' )
os += "SE ";
}
if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90)
{
os += "Windows Millennium Edition";
}
}
break;
case VER_PLATFORM_WIN32s:
{
os += "Win32s";
}
break;
}
char szVer[80] = {0};
sprintf_s( szVer, 79, " %d.%d ", osvi.dwMajorVersion, osvi.dwMinorVersion );
os += szVer;
}
以上只能获取WIN8以下系统的信息
对于WIN8以上,比如WIN10就不可以了,可以用以下方法取WIN10的操作系统信息
方法1:通过内嵌清单,只适用于exe内嵌清单,dll内嵌清单没用
<?xml version="1.0" encoding="UTF-8"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
<!-- Windows 8.1 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
<!-- Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<!-- Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<!-- Windows 8 -->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
</application>
</compatibility>
</assembly>
方法2:通过kernel32.dll文件版本号
BOOL IsFileVersionWindows10OrGreater()
{
DWORD dwVerInfoSize = GetFileVersionInfoSizeW(L"kernel32.dll", NULL);
if (0 != dwVerInfoSize)
{
LPWSTR pszBuffer = (LPWSTR)_alloca(dwVerInfoSize*sizeof(WCHAR));
if (TRUE == GetFileVersionInfoW(L"kernel32.dll", 0, dwVerInfoSize, pszBuffer))
{
VS_FIXEDFILEINFO* pVsInfo = NULL;
UINT nFileInfoSize = sizeof(VS_FIXEDFILEINFO);
if (TRUE == VerQueryValueW(pszBuffer, L"\\", (void**)&pVsInfo, &nFileInfoSize))
{
printf("%d.%d.%d.%d\n", HIWORD(pVsInfo->dwFileVersionMS), LOWORD(pVsInfo->dwFileVersionMS), HIWORD(pVsInfo->dwFileVersionLS), LOWORD(pVsInfo->dwFileVersionLS));
if (HIWORD(pVsInfo->dwFileVersionMS)>=10)
{
return TRUE;
}
}
}
}
return FALSE;
}
方法3:通过versionhelper
/******************************************************************
* *
* VersionHelpers.h -- This module defines helper functions to *
* promote version check with proper *
* comparisons. *
* *
* Copyright (c) Microsoft Corp. All rights reserved. *
* *
******************************************************************/
#ifndef _versionhelpers_H_INCLUDED_
#define _versionhelpers_H_INCLUDED_
#ifndef ___XP_BUILD
#define WINAPI_PARTITION_DESKTOP (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP)
#define WINAPI_FAMILY WINAPI_FAMILY_DESKTOP_APP
#define WINAPI_FAMILY_PARTITION(Partitions) (Partitions)
#define _WIN32_WINNT_NT4 0x0400
#define _WIN32_WINNT_WIN2K 0x0500
#define _WIN32_WINNT_WINXP 0x0501
#define _WIN32_WINNT_WS03 0x0502
#define _WIN32_WINNT_WIN6 0x0600
#define _WIN32_WINNT_VISTA 0x0600
#define _WIN32_WINNT_WS08 0x0600
#define _WIN32_WINNT_LONGHORN 0x0600
#define _WIN32_WINNT_WIN7 0x0601
#define _WIN32_WINNT_WIN8 0x0602
#endif
#ifdef _MSC_VER
#pragma once
#endif // _MSC_VER
#pragma region Application Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
#include <specstrings.h> // for _In_, etc.
#if !defined(__midl) && !defined(SORTPP_PASS)
#if (NTDDI_VERSION >= NTDDI_WINXP)
#ifdef __cplusplus
#define VERSIONHELPERAPI inline bool
#else // __cplusplus
#define VERSIONHELPERAPI FORCEINLINE BOOL
#endif // __cplusplus
#define _WIN32_WINNT_WINBLUE 0x0603
#define _WIN32_WINNT_WIN10 0x0A00
typedef LONG (NTAPI* fnRtlGetVersion)(PRTL_OSVERSIONINFOW lpVersionInformation);
VERSIONHELPERAPI
IsWindowsVersionOrGreater(WORD wMajorVersion, WORD wMinorVersion, WORD wServicePackMajor)
{
/*OSVERSIONINFOEXW osvi = { sizeof(osvi), 0, 0, 0, 0, {0}, 0, 0 };
DWORDLONG const dwlConditionMask = VerSetConditionMask(
VerSetConditionMask(
VerSetConditionMask(
0, VER_MAJORVERSION, VER_GREATER_EQUAL),
VER_MINORVERSION, VER_GREATER_EQUAL),
VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL);
osvi.dwMajorVersion = wMajorVersion;
osvi.dwMinorVersion = wMinorVersion;
osvi.wServicePackMajor = wServicePackMajor;
return VerifyVersionInfoW(&osvi, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR, dwlConditionMask) != FALSE;*/
RTL_OSVERSIONINFOEXW verInfo = { 0 };
verInfo.dwOSVersionInfoSize = sizeof( verInfo );
static fnRtlGetVersion RtlGetVersion = (fnRtlGetVersion)GetProcAddress( GetModuleHandleW( L"ntdll.dll" ), "RtlGetVersion" );
if (RtlGetVersion != 0 && RtlGetVersion( (PRTL_OSVERSIONINFOW)&verInfo ) == 0)
{
if (verInfo.dwMajorVersion > wMajorVersion)
return true;
else if (verInfo.dwMajorVersion < wMajorVersion)
return false;
if (verInfo.dwMinorVersion > wMinorVersion)
return true;
else if (verInfo.dwMinorVersion < wMinorVersion)
return false;
if (verInfo.wServicePackMajor >= wServicePackMajor)
return true;
}
return false;
}
VERSIONHELPERAPI
IsWindowsXPOrGreater()
{
return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_WINXP ), LOBYTE( _WIN32_WINNT_WINXP ), 0 );
}
VERSIONHELPERAPI
IsWindowsXPSP1OrGreater()
{
return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_WINXP ), LOBYTE( _WIN32_WINNT_WINXP ), 1 );
}
VERSIONHELPERAPI
IsWindowsXPSP2OrGreater()
{
return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_WINXP ), LOBYTE( _WIN32_WINNT_WINXP ), 2 );
}
VERSIONHELPERAPI
IsWindowsXPSP3OrGreater()
{
return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_WINXP ), LOBYTE( _WIN32_WINNT_WINXP ), 3 );
}
VERSIONHELPERAPI
IsWindowsVistaOrGreater()
{
return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_VISTA ), LOBYTE( _WIN32_WINNT_VISTA ), 0 );
}
VERSIONHELPERAPI
IsWindowsVistaSP1OrGreater()
{
return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_VISTA ), LOBYTE( _WIN32_WINNT_VISTA ), 1 );
}
VERSIONHELPERAPI
IsWindowsVistaSP2OrGreater()
{
return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_VISTA ), LOBYTE( _WIN32_WINNT_VISTA ), 2 );
}
VERSIONHELPERAPI
IsWindows7OrGreater()
{
return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_WIN7 ), LOBYTE( _WIN32_WINNT_WIN7 ), 0 );
}
VERSIONHELPERAPI
IsWindows7SP1OrGreater()
{
return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_WIN7 ), LOBYTE( _WIN32_WINNT_WIN7 ), 1 );
}
VERSIONHELPERAPI
IsWindows8OrGreater()
{
return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_WIN8 ), LOBYTE( _WIN32_WINNT_WIN8 ), 0 );
}
VERSIONHELPERAPI
IsWindows8Point1OrGreater()
{
return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_WINBLUE ), LOBYTE( _WIN32_WINNT_WINBLUE ), 0 );
}
VERSIONHELPERAPI
IsWindows10OrGreater()
{
return IsWindowsVersionOrGreater( HIBYTE( _WIN32_WINNT_WIN10 ), LOBYTE( _WIN32_WINNT_WIN10 ), 0 );
}
VERSIONHELPERAPI
IsWindowsServer()
{
OSVERSIONINFOEXW osvi = { sizeof( osvi ), 0, 0, 0, 0, { 0 }, 0, 0, 0, VER_NT_WORKSTATION };
DWORDLONG const dwlConditionMask = VerSetConditionMask( 0, VER_PRODUCT_TYPE, VER_EQUAL );
return !VerifyVersionInfoW( &osvi, VER_PRODUCT_TYPE, dwlConditionMask );
}
#endif // NTDDI_VERSION
#endif // defined(__midl)
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
#pragma endregion
#endif // _VERSIONHELPERS_H_INCLUDED_
例子工程下载http://download.csdn.net/detail/i7thtool/9667125