在程序中判断Windows版本这本应该是一个极其简单的API就能完成的工作,但由于微软的失误,使得Windows操作系统家族的版本正变得混乱不堪,一个最新的例子是Windows Vista和Windows 2008 Server的版本均为6.0。上世纪90年代Windows 9x和Windows NT的版本混乱主要是因为程序员的错误(或失误)导致的,那么这一次的版本混乱又是因为什么导致的?如果是某些人为的决定导致这样的结果,我只能说这个决定是极其愚蠢的,因为这个愚蠢的决定已经导致版本的意义完全失去了。
废话不多说了,直接贴代码,以下代码可在Vs2005/Vs2008下编译通过。
#include " stdafx.h "
#include < windows.h >
#include < tchar.h >
#include < stdio.h >
#ifndef WSTR
#define WSTR(x) L##x
#endif
#ifndef SM_SERVERR2
#define SM_SERVERR2 89
#endif
// 前置声明
WCHAR * GetOperationSystemInfoOld( WCHAR * szBuffer,size_t szLength);
// GetNativeSystemInfo函数原型(WOW64) (XP,Vista,2003,2008)
typedef void (WINAPI * PGNSI)(LPSYSTEM_INFO lpSystemInfo);
// GetProductInfo函数原型(Vista/2008)
typedef BOOL (WINAPI * PGPI)(DWORD dwOSMajorVersion, DWORD dwOSMinorVersion, DWORD dwSpMajorVersion, DWORD dwSpMinorVersion, PDWORD pdwReturnedProductType);
// ProductType常量
#define PRODUCT_UNDEFINED 0x00000000 // An unknown product
#define PRODUCT_ULTIMATE 0x00000001 // Ultimate Edition
#define PRODUCT_HOME_BASIC 0x00000002 // Home Basic Edition
#define PRODUCT_HOME_PREMIUM 0x00000003 // Home Premium Edition
#define PRODUCT_ENTERPRISE 0x00000004 // Enterprise Edition
#define PRODUCT_HOME_BASIC_N 0x00000005 // Home Basic Edition
#define PRODUCT_BUSINESS 0x00000006 // Business Edition
#define PRODUCT_STANDARD_SERVER 0x00000007 // Server Standard Edition (full installation)
#define PRODUCT_DATACENTER_SERVER 0x00000008 // Server Datacenter Edition (full installation)
#define PRODUCT_SMALLBUSINESS_SERVER 0x00000009 // Small Business Server
#define PRODUCT_ENTERPRISE_SERVER 0x0000000A // Server Enterprise Edition (full installation)
#define PRODUCT_STARTER 0x0000000B // Starter Edition
#define PRODUCT_DATACENTER_SERVER_CORE 0x0000000C // Server Datacenter Edition (core installation)
#define PRODUCT_STANDARD_SERVER_CORE 0x0000000D // Server Standard Edition (core installation)
#define PRODUCT_ENTERPRISE_SERVER_CORE 0x0000000E // Server Enterprise Edition (core installation)
#define PRODUCT_ENTERPRISE_SERVER_IA64 0x0000000F // Server Enterprise Edition for Itanium-based Systems
#define PRODUCT_BUSINESS_N 0x00000010 // Business Edition
#define PRODUCT_WEB_SERVER 0x00000011 // Web Server Edition (full installation)
#define PRODUCT_CLUSTER_SERVER 0x00000012 // Cluster Server Edition
#define PRODUCT_HOME_SERVER 0x00000013 // Home Server Edition
#define PRODUCT_STORAGE_EXPRESS_SERVER 0x00000014 // Storage Server Express Edition
#define PRODUCT_STORAGE_STANDARD_SERVER 0x00000015 // Storage Server Standard Edition
#define PRODUCT_STORAGE_WORKGROUP_SERVER 0x00000016 // Storage Server Workgroup Edition
#define PRODUCT_STORAGE_ENTERPRISE_SERVER 0x00000017 // Storage Server Enterprise Edition
#define PRODUCT_SERVER_FOR_SMALLBUSINESS 0x00000018 // Server for Small Business Edition
#define PRODUCT_SMALLBUSINESS_SERVER_PREMIUM 0x00000019 // Small Business Server Premium Edition
#define PRODUCT_HOME_PREMIUM_N 0x0000001A // Home Premium Edition
#define PRODUCT_ENTERPRISE_N 0x0000001B // Enterprise Edition
#define PRODUCT_ULTIMATE_N 0x0000001C // Ultimate Edition
#define PRODUCT_WEB_SERVER_CORE 0x0000001D // Web Server Edition (core installation)
#define PRODUCT_UNLICENSED 0xABCDABCD // Unlicensed edition
/// <summary>
/// 获得操作系统的信息(2000以前)。
/// </summary>
/// <param name="szBuffer">
/// 用于保存信息的缓冲区(必须足够大)。
/// </param>
/// <returns>
/// 返回操作系统信息。
/// </returns>
WCHAR * GetOperationSystemInfoOld( WCHAR * szBuffer,size_t szLength)
{
// 获得操作系统版本信息
OSVERSIONINFOW osvi = { 0 };
osvi.dwOSVersionInfoSize = sizeof ( OSVERSIONINFOW );
if ( ! GetVersionExW( & osvi ) )
{
szBuffer[ 0 ] = WSTR( ' ' );
return szBuffer;
}
LPWSTR pszTemp = szBuffer;
size_t szTempLen = szLength;
int iLength = 0 ;
// Windows Me, Windows 98, or Windows 95
废话不多说了,直接贴代码,以下代码可在Vs2005/Vs2008下编译通过。
#include " stdafx.h "
#include < windows.h >
#include < tchar.h >
#include < stdio.h >
#ifndef WSTR
#define WSTR(x) L##x
#endif
#ifndef SM_SERVERR2
#define SM_SERVERR2 89
#endif
// 前置声明
WCHAR * GetOperationSystemInfoOld( WCHAR * szBuffer,size_t szLength);
// GetNativeSystemInfo函数原型(WOW64) (XP,Vista,2003,2008)
typedef void (WINAPI * PGNSI)(LPSYSTEM_INFO lpSystemInfo);
// GetProductInfo函数原型(Vista/2008)
typedef BOOL (WINAPI * PGPI)(DWORD dwOSMajorVersion, DWORD dwOSMinorVersion, DWORD dwSpMajorVersion, DWORD dwSpMinorVersion, PDWORD pdwReturnedProductType);
// ProductType常量
#define PRODUCT_UNDEFINED 0x00000000 // An unknown product
#define PRODUCT_ULTIMATE 0x00000001 // Ultimate Edition
#define PRODUCT_HOME_BASIC 0x00000002 // Home Basic Edition
#define PRODUCT_HOME_PREMIUM 0x00000003 // Home Premium Edition
#define PRODUCT_ENTERPRISE 0x00000004 // Enterprise Edition
#define PRODUCT_HOME_BASIC_N 0x00000005 // Home Basic Edition
#define PRODUCT_BUSINESS 0x00000006 // Business Edition
#define PRODUCT_STANDARD_SERVER 0x00000007 // Server Standard Edition (full installation)
#define PRODUCT_DATACENTER_SERVER 0x00000008 // Server Datacenter Edition (full installation)
#define PRODUCT_SMALLBUSINESS_SERVER 0x00000009 // Small Business Server
#define PRODUCT_ENTERPRISE_SERVER 0x0000000A // Server Enterprise Edition (full installation)
#define PRODUCT_STARTER 0x0000000B // Starter Edition
#define PRODUCT_DATACENTER_SERVER_CORE 0x0000000C // Server Datacenter Edition (core installation)
#define PRODUCT_STANDARD_SERVER_CORE 0x0000000D // Server Standard Edition (core installation)
#define PRODUCT_ENTERPRISE_SERVER_CORE 0x0000000E // Server Enterprise Edition (core installation)
#define PRODUCT_ENTERPRISE_SERVER_IA64 0x0000000F // Server Enterprise Edition for Itanium-based Systems
#define PRODUCT_BUSINESS_N 0x00000010 // Business Edition
#define PRODUCT_WEB_SERVER 0x00000011 // Web Server Edition (full installation)
#define PRODUCT_CLUSTER_SERVER 0x00000012 // Cluster Server Edition
#define PRODUCT_HOME_SERVER 0x00000013 // Home Server Edition
#define PRODUCT_STORAGE_EXPRESS_SERVER 0x00000014 // Storage Server Express Edition
#define PRODUCT_STORAGE_STANDARD_SERVER 0x00000015 // Storage Server Standard Edition
#define PRODUCT_STORAGE_WORKGROUP_SERVER 0x00000016 // Storage Server Workgroup Edition
#define PRODUCT_STORAGE_ENTERPRISE_SERVER 0x00000017 // Storage Server Enterprise Edition
#define PRODUCT_SERVER_FOR_SMALLBUSINESS 0x00000018 // Server for Small Business Edition
#define PRODUCT_SMALLBUSINESS_SERVER_PREMIUM 0x00000019 // Small Business Server Premium Edition
#define PRODUCT_HOME_PREMIUM_N 0x0000001A // Home Premium Edition
#define PRODUCT_ENTERPRISE_N 0x0000001B // Enterprise Edition
#define PRODUCT_ULTIMATE_N 0x0000001C // Ultimate Edition
#define PRODUCT_WEB_SERVER_CORE 0x0000001D // Web Server Edition (core installation)
#define PRODUCT_UNLICENSED 0xABCDABCD // Unlicensed edition
/// <summary>
/// 获得操作系统的信息(2000以前)。
/// </summary>
/// <param name="szBuffer">
/// 用于保存信息的缓冲区(必须足够大)。
/// </param>
/// <returns>
/// 返回操作系统信息。
/// </returns>
WCHAR * GetOperationSystemInfoOld( WCHAR * szBuffer,size_t szLength)
{
// 获得操作系统版本信息
OSVERSIONINFOW osvi = { 0 };
osvi.dwOSVersionInfoSize = sizeof ( OSVERSIONINFOW );
if ( ! GetVersionExW( & osvi ) )
{
szBuffer[ 0 ] = WSTR( ' ' );
return szBuffer;
}
LPWSTR pszTemp = szBuffer;
size_t szTempLen = szLength;
int iLength = 0 ;
// Windows Me, Windows 98, or Windows 95