VC++ 获取操作系统的版本GetVersionEx函数

修改后文章移至这里

修改后的版本:

#define VER_SUITE_WH_SERVER                 0x00008000
typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);
typedef BOOL (WINAPI *PGPI)(DWORD, DWORD, DWORD, DWORD, PDWORD);
BOOL GetOSDisplayString( CString &strOSDosplay )
{
	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);
	if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) )
		return 1;
	// Call GetNativeSystemInfo if supported or GetSystemInfo otherwise.
	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 )
	{
		 strOSDosplay = TEXT("Microsoft ");
		// Test for the specific product.
		if ( osvi.dwMajorVersion == 6 )
		{
			if( osvi.dwMinorVersion == 0 )
			{
				if( osvi.wProductType == VER_NT_WORKSTATION )
					strOSDosplay += TEXT("Windows Vista ");
				else strOSDosplay += TEXT("Windows Server 2008 " );
			}
			if ( osvi.dwMinorVersion == 1 )
			{
				if( osvi.wProductType == VER_NT_WORKSTATION )
					strOSDosplay += TEXT("Windows 7 ");
				else strOSDosplay += TEXT("Windows Server 2008 R2 " );
			}
			pGPI = (PGPI) GetProcAddress(
				GetModuleHandle(TEXT("kernel32.dll")), 
				"GetProductInfo");
			pGPI( osvi.dwMajorVersion, osvi.dwMinorVersion, 0, 0, &dwType);
			switch( dwType )
			{
			case PRODUCT_ULTIMATE:
				strOSDosplay += TEXT("Ultimate Edition" );
				break;
			case PRODUCT_HOME_PREMIUM:
				strOSDosplay += TEXT("Home Premium Edition" );
				break;
			case PRODUCT_HOME_BASIC:
				strOSDosplay += TEXT("Home Basic Edition" );
				break;
			case PRODUCT_ENTERPRISE:
				strOSDosplay += TEXT("Enterprise Edition" );
				break;
			case PRODUCT_BUSINESS:
				strOSDosplay += TEXT("Business Edition" );
				break;
			case PRODUCT_STARTER:
				strOSDosplay += TEXT("Starter Edition" );
				break;
			case PRODUCT_CLUSTER_SERVER:
				strOSDosplay += TEXT("Cluster Server Edition" );
				break;
			case PRODUCT_DATACENTER_SERVER:
				strOSDosplay += TEXT("Datacenter Edition" );
				break;
			case PRODUCT_DATACENTER_SERVER_CORE:
				strOSDosplay += TEXT("Datacenter Edition (core installation)" );
				break;
			case PRODUCT_ENTERPRISE_SERVER:
				strOSDosplay += TEXT("Enterprise Edition" );
				break;
			case PRODUCT_ENTERPRISE_SERVER_CORE:
				strOSDosplay += TEXT("Enterprise Edition (core installation)" );
				break;
			case PRODUCT_ENTERPRISE_SERVER_IA64:
				strOSDosplay += TEXT("Enterprise Edition for Itanium-based Systems" );
				break;
			case PRODUCT_SMALLBUSINESS_SERVER:
				strOSDosplay += TEXT("Small Business Server" );
				break;
			case PRODUCT_SMALLBUSINESS_SERVER_PREMIUM:
				strOSDosplay += TEXT("Small Business Server Premium Edition" );
				break;
			case PRODUCT_STANDARD_SERVER:
				strOSDosplay += TEXT("Standard Edition" );
				break;
			case PRODUCT_STANDARD_SERVER_CORE:
				strOSDosplay += TEXT("Standard Edition (core installation)" );
				break;
			case PRODUCT_WEB_SERVER:
				strOSDosplay += TEXT("Web Server Edition" );
				break;
			}
		}
		if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 )
		{
			if( GetSystemMetrics(SM_SERVERR2) )
				strOSDosplay += TEXT( "Windows Server 2003 R2, ");
			else if ( osvi.wSuiteMask==VER_SUITE_STORAGE_SERVER )
				strOSDosplay += TEXT( "Windows Storage Server 2003");
			else if ( osvi.wSuiteMask==VER_SUITE_WH_SERVER )
				strOSDosplay += TEXT( "Windows Home Server");
			else if( osvi.wProductType == VER_NT_WORKSTATION &&
				si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)
			{
				strOSDosplay += TEXT( "Windows XP Professional x64 Edition");
			}
			else strOSDosplay += TEXT("Windows Server 2003, ");
			// Test for the server type.
			if ( osvi.wProductType != VER_NT_WORKSTATION )
			{
				if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_IA64 )
				{
					if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
						strOSDosplay += TEXT( "Datacenter Edition for Itanium-based Systems" );
					else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
						strOSDosplay += TEXT( "Enterprise Edition for Itanium-based Systems" );
				}
				else if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 )
				{
					if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
						strOSDosplay += TEXT( "Datacenter x64 Edition" );
					else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
						strOSDosplay += TEXT( "Enterprise x64 Edition" );
					else strOSDosplay += TEXT( "Standard x64 Edition" );
				}
				else
				{
					if ( osvi.wSuiteMask & VER_SUITE_COMPUTE_SERVER )
						strOSDosplay += TEXT( "Compute Cluster Edition" );
					else if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
						strOSDosplay += TEXT( "Datacenter Edition" );
					else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
						strOSDosplay += TEXT( "Enterprise Edition" );
					else if ( osvi.wSuiteMask & VER_SUITE_BLADE )
						strOSDosplay += TEXT( "Web Edition" );
					else strOSDosplay += TEXT( "Standard Edition" );
				}
			}
		}
		if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 )
		{
			strOSDosplay += TEXT("Windows XP ");
			if( osvi.wSuiteMask & VER_SUITE_PERSONAL )
				strOSDosplay += TEXT( "Home Edition" );
			else strOSDosplay += TEXT( "Professional" );
		}
		if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 )
		{
			strOSDosplay += TEXT("Windows 2000 ");
			if ( osvi.wProductType == VER_NT_WORKSTATION )
			{
				strOSDosplay += TEXT( "Professional" );
			}
			else 
			{
				if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
					strOSDosplay += TEXT( "Datacenter Server" );
				else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
					strOSDosplay += TEXT( "Advanced Server" );
				else strOSDosplay += TEXT( "Server" );
			}
		}
		// Include service pack (if any) and build number.
		if( _tcslen(osvi.szCSDVersion) > 0 )
		{
			strOSDosplay += TEXT(" ") ;
			strOSDosplay += osvi.szCSDVersion;
		}
		CString strTemp;
		strTemp.Format(_T("(build %d)"), osvi.dwBuildNumber);
		strOSDosplay += strTemp;
		if ( osvi.dwMajorVersion >= 6 )
		{
			if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 )
				strOSDosplay += TEXT( ", 64-bit" );
			else if (si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_INTEL )
				strOSDosplay += TEXT(", 32-bit");
		}
		return TRUE; 
	}

	else
	{ 
		printf( "This sample does not support this version of Windows.\n");
		return FALSE;
	}
}

文章来源:http://blog.sina.com.cn/s/blog_8a7012cf010189tn.html

函数:BOOL CSystemOperate::GetOSDisplayString( LPTSTR pszOS );

LPTSTR pszOS将保存操作系统的版本信息
实现如下:
BOOL CSystemOperate::GetOSDisplayString( LPTSTR pszOS )
{
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);
if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) )
return 1;
// Call GetNativeSystemInfo if supported or GetSystemInfo otherwise.
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, BUFSIZE, TEXT("Microsoft "));
// Test for the specific product.
if ( osvi.dwMajorVersion == 6 )
{
if( osvi.dwMinorVersion == 0 )
{
if( osvi.wProductType == VER_NT_WORKSTATION )
StringCchCat(pszOS, BUFSIZE, TEXT("Windows Vista "));
else StringCchCat(pszOS, BUFSIZE, TEXT("Windows Server 2008 " ));
}
if ( osvi.dwMinorVersion == 1 )
{
if( osvi.wProductType == VER_NT_WORKSTATION )
StringCchCat(pszOS, BUFSIZE, TEXT("Windows 7 "));
else StringCchCat(pszOS, BUFSIZE, TEXT("Windows Server 2008 R2 " ));
}
pGPI = (PGPI) GetProcAddress(
GetModuleHandle(TEXT("kernel32.dll")), 
"GetProductInfo");
pGPI( osvi.dwMajorVersion, osvi.dwMinorVersion, 0, 0, &dwType);
switch( dwType )
{
case PRODUCT_ULTIMATE:
StringCchCat(pszOS, BUFSIZE, TEXT("Ultimate Edition" ));
break;
case PRODUCT_HOME_PREMIUM:
StringCchCat(pszOS, BUFSIZE, TEXT("Home Premium Edition" ));
break;
case PRODUCT_HOME_BASIC:
StringCchCat(pszOS, BUFSIZE, TEXT("Home Basic Edition" ));
break;
case PRODUCT_ENTERPRISE:
StringCchCat(pszOS, BUFSIZE, TEXT("Enterprise Edition" ));
break;
case PRODUCT_BUSINESS:
StringCchCat(pszOS, BUFSIZE, TEXT("Business Edition" ));
break;
case PRODUCT_STARTER:
StringCchCat(pszOS, BUFSIZE, TEXT("Starter Edition" ));
break;
case PRODUCT_CLUSTER_SERVER:
StringCchCat(pszOS, BUFSIZE, TEXT("Cluster Server Edition" ));
break;
case PRODUCT_DATACENTER_SERVER:
StringCchCat(pszOS, BUFSIZE, TEXT("Datacenter Edition" ));
break;
case PRODUCT_DATACENTER_SERVER_CORE:
StringCchCat(pszOS, BUFSIZE, TEXT("Datacenter Edition (core installation)" ));
break;
case PRODUCT_ENTERPRISE_SERVER:
StringCchCat(pszOS, BUFSIZE, TEXT("Enterprise Edition" ));
break;
case PRODUCT_ENTERPRISE_SERVER_CORE:
StringCchCat(pszOS, BUFSIZE, TEXT("Enterprise Edition (core installation)" ));
break;
case PRODUCT_ENTERPRISE_SERVER_IA64:
StringCchCat(pszOS, BUFSIZE, TEXT("Enterprise Edition for Itanium-based Systems" ));
break;
case PRODUCT_SMALLBUSINESS_SERVER:
StringCchCat(pszOS, BUFSIZE, TEXT("Small Business Server" ));
break;
case PRODUCT_SMALLBUSINESS_SERVER_PREMIUM:
StringCchCat(pszOS, BUFSIZE, TEXT("Small Business Server Premium Edition" ));
break;
case PRODUCT_STANDARD_SERVER:
StringCchCat(pszOS, BUFSIZE, TEXT("Standard Edition" ));
break;
case PRODUCT_STANDARD_SERVER_CORE:
StringCchCat(pszOS, BUFSIZE, TEXT("Standard Edition (core installation)" ));
break;
case PRODUCT_WEB_SERVER:
StringCchCat(pszOS, BUFSIZE, TEXT("Web Server Edition" ));
break;
}
}
if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 )
{
if( GetSystemMetrics(SM_SERVERR2) )
StringCchCat(pszOS, BUFSIZE, TEXT( "Windows Server 2003 R2, "));
else if ( osvi.wSuiteMask==VER_SUITE_STORAGE_SERVER )
StringCchCat(pszOS, BUFSIZE, TEXT( "Windows Storage Server 2003"));
else if ( osvi.wSuiteMask== VER_SUITE_WH_SERVER )
StringCchCat(pszOS, BUFSIZE, TEXT( "Windows Home Server"));
else if( osvi.wProductType == VER_NT_WORKSTATION &&
si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)
{
StringCchCat(pszOS, BUFSIZE, TEXT( "Windows XP Professional x64 Edition"));
}
else StringCchCat(pszOS, BUFSIZE, TEXT("Windows Server 2003, "));
// Test for the server type.
if ( osvi.wProductType != VER_NT_WORKSTATION )
{
if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_IA64 )
{
if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
StringCchCat(pszOS, BUFSIZE, TEXT( "Datacenter Edition for Itanium-based Systems" ));
else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
StringCchCat(pszOS, BUFSIZE, TEXT( "Enterprise Edition for Itanium-based Systems" ));
}
else if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 )
{
if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
StringCchCat(pszOS, BUFSIZE, TEXT( "Datacenter x64 Edition" ));
else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
StringCchCat(pszOS, BUFSIZE, TEXT( "Enterprise x64 Edition" ));
else StringCchCat(pszOS, BUFSIZE, TEXT( "Standard x64 Edition" ));
}
else
{
if ( osvi.wSuiteMask & VER_SUITE_COMPUTE_SERVER )
StringCchCat(pszOS, BUFSIZE, TEXT( "Compute Cluster Edition" ));
else if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
StringCchCat(pszOS, BUFSIZE, TEXT( "Datacenter Edition" ));
else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
StringCchCat(pszOS, BUFSIZE, TEXT( "Enterprise Edition" ));
else if ( osvi.wSuiteMask & VER_SUITE_BLADE )
StringCchCat(pszOS, BUFSIZE, TEXT( "Web Edition" ));
else StringCchCat(pszOS, BUFSIZE, TEXT( "Standard Edition" ));
}
}
}
if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 )
{
StringCchCat(pszOS, BUFSIZE, TEXT("Windows XP "));
if( osvi.wSuiteMask & VER_SUITE_PERSONAL )
StringCchCat(pszOS, BUFSIZE, TEXT( "Home Edition" ));
else StringCchCat(pszOS, BUFSIZE, TEXT( "Professional" ));
}
if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 )
{
StringCchCat(pszOS, BUFSIZE, TEXT("Windows 2000 "));
if ( osvi.wProductType == VER_NT_WORKSTATION )
{
StringCchCat(pszOS, BUFSIZE, TEXT( "Professional" ));
}
else 
{
if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
StringCchCat(pszOS, BUFSIZE, TEXT( "Datacenter Server" ));
else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
StringCchCat(pszOS, BUFSIZE, TEXT( "Advanced Server" ));
else StringCchCat(pszOS, BUFSIZE, TEXT( "Server" ));
}
}
// Include service pack (if any) and build number.
if( _tcslen(osvi.szCSDVersion) > 0 )
{
StringCchCat(pszOS, BUFSIZE, TEXT(" ") );
StringCchCat(pszOS, BUFSIZE, osvi.szCSDVersion);
}
TCHAR buf[80];
StringCchPrintf( buf, 80, TEXT(" (build %d)"), osvi.dwBuildNumber);
StringCchCat(pszOS, BUFSIZE, buf);
if ( osvi.dwMajorVersion >= 6 )
{
if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 )
StringCchCat(pszOS, BUFSIZE, TEXT( ", 64-bit" ));
else if (si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_INTEL )
StringCchCat(pszOS, BUFSIZE, TEXT(", 32-bit"));
}
return TRUE; 
}

else
printf( "This sample does not support this version of Windows.\n");
return FALSE;
}
}

在函数的前面需要定义如下宏:
#pragma comment(lib, "User32.lib")
#define BUFSIZE 256
#define PRODUCT_ULTIMATE                                          0x00000001
#define PRODUCT_HOME_BASIC                                       0x00000002
#define PRODUCT_HOME_PREMIUM                                    0x00000003
#define PRODUCT_ENTERPRISE                                       0x00000004
#define PRODUCT_HOME_BASIC_N                                    0x00000005
#define PRODUCT_BUSINESS                                          0x00000006
#define PRODUCT_STANDARD_SERVER                               0x00000007
#define PRODUCT_DATACENTER_SERVER                            0x00000008
#define PRODUCT_SMALLBUSINESS_SERVER                        0x00000009
#define PRODUCT_ENTERPRISE_SERVER                            0x0000000A
#define PRODUCT_STARTER                                           0x0000000B
#define PRODUCT_DATACENTER_SERVER_CORE                     0x0000000C
#define PRODUCT_STANDARD_SERVER_CORE                        0x0000000D
#define PRODUCT_ENTERPRISE_SERVER_CORE                     0x0000000E
#define PRODUCT_ENTERPRISE_SERVER_IA64                     0x0000000F
#define PRODUCT_BUSINESS_N                                       0x00000010
#define PRODUCT_WEB_SERVER                                       0x00000011
#define PRODUCT_CLUSTER_SERVER                                 0x00000012
#define PRODUCT_HOME_SERVER                                     0x00000013
#define PRODUCT_STORAGE_EXPRESS_SERVER                     0x00000014
#define PRODUCT_STORAGE_STANDARD_SERVER                   0x00000015

#define PRODUCT_STORAGE_WORKGROUP_SERVER                  0x00000016
#define PRODUCT_STORAGE_ENTERPRISE_SERVER                0x00000017
#define PRODUCT_SERVER_FOR_SMALLBUSINESS                  0x00000018
#define PRODUCT_SMALLBUSINESS_SERVER_PREMIUM            0x00000019
#define PRODUCT_HOME_PREMIUM_N                                 0x0000001A
#define PRODUCT_ENTERPRISE_N                                    0x0000001B
#define PRODUCT_ULTIMATE_N                                       0x0000001C
#define PRODUCT_WEB_SERVER_CORE                               0x0000001D
#define PRODUCT_MEDIUMBUSINESS_SERVER_MANAGEMENT      0x0000001E
#define PRODUCT_MEDIUMBUSINESS_SERVER_SECURITY         0x0000001F
#define PRODUCT_MEDIUMBUSINESS_SERVER_MESSAGING       0x00000020
#define PRODUCT_SMALLBUSINESS_SERVER_PRIME               0x00000021
#define PRODUCT_HOME_PREMIUM_SERVER                         0x00000022
#define PRODUCT_SERVER_FOR_SMALLBUSINESS_V               0x00000023
#define PRODUCT_STANDARD_SERVER_V                            0x00000024
#define PRODUCT_DATACENTER_SERVER_V                         0x00000025
#define PRODUCT_ENTERPRISE_SERVER_V                         0x00000026
#define PRODUCT_DATACENTER_SERVER_CORE_V                  0x00000027
#define PRODUCT_STANDARD_SERVER_CORE_V                     0x00000028
#define PRODUCT_ENTERPRISE_SERVER_CORE_V                  0x00000029
#define PRODUCT_HYPERV                                             0x0000002A
#define SM_TABLETPC                   86
#define SM_MEDIACENTER               87
#define SM_STARTER                     88
#define SM_SERVERR2                   89
#define VER_SERVER_NT                                  0x80000000
#define VER_WORKSTATION_NT                           0x40000000
#define VER_SUITE_SMALLBUSINESS                   0x00000001
#define VER_SUITE_ENTERPRISE                        0x00000002
#define VER_SUITE_BACKOFFICE                        0x00000004
#define VER_SUITE_COMMUNICATIONS                  0x00000008
#define VER_SUITE_TERMINAL                           0x00000010
#define VER_SUITE_SMALLBUSINESS_RESTRICTED 0x00000020
#define VER_SUITE_EMBEDDEDNT                        0x00000040
#define VER_SUITE_DATACENTER                        0x00000080
#define VER_SUITE_SINGLEUSERTS                     0x00000100
#define VER_SUITE_PERSONAL                           0x00000200
#define VER_SUITE_BLADE                               0x00000400
#define VER_SUITE_EMBEDDED_RESTRICTED          0x00000800
#define VER_SUITE_SECURITY_APPLIANCE            0x00001000
#define VER_SUITE_STORAGE_SERVER                  0x00002000
#define VER_SUITE_COMPUTE_SERVER                  0x00004000
#define  VER_SUITE_WH_SERVER                         0x00008000

typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);
typedef BOOL (WINAPI *PGPI)(DWORD, DWORD, DWORD, DWORD, PDWORD);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

daiafei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值