GetVersionEx 获取系统版本信息

最近在windows 8上获取系统版本信息需要调用系统API,于是用到了GetVersionEx。

 Windows API 中有两个函数可以得到系统版本信息:GetVersion和GetVersionEx。

 GetVersion这个函数曾经困扰了很多程序员,其本来设计的是在DWORD返回值中用低位的那个字表示MS-DOS的版本号,高位的那个字表示Windows版本号。对于每个字来说,高位字节代表主要版本号,低位字节代表次要版本号。可是因为编写此函数的程序员犯了一个错误,使得此函数返回的Windows版本号颠倒了(即把主要版本号放到了低位字节,而次要版本号放到了高位字节)。当发现此错误的时候已经有很多程序员在使用这个函数了,Microsoft只好将错就错,直接把原来的API文档给改了过来。

 为了解决GetVersion带来的问题,Microsoft后来开发了一个新的函数GetVersionEx,用它能够得到更详细的Windows系统的版本信息,下面我就写写GetVersionEx的使用方法。


首先看一看函数原型:

[cpp] view plain copy
  1. BOOL GetVersionEx(POSVERSIONINFO pVersionInformation);  

结构OSVERSIONINFOEX定义如下:
[cpp] view plain copy
  1. typedef struct {  
  2.     DWORD dwOSVersionInfoSize;       //在使用GetVersionEx之前要将此初始化为结构的大小  
  3.     DWORD dwMajorVersion;               //系统主版本号  
  4.     DWORD dwMinorVersion;               //系统次版本号  
  5.     DWORD dwBuildNumber;               //系统构建号  
  6.     DWORD dwPlatformId;                  //系统支持的平台  
  7.     TCHAR szCSDVersion[128];          //系统补丁包的名称  
  8.     WORD wServicePackMajor;            //系统补丁包的主版本  
  9.     WORD wServicePackMinor;            //系统补丁包的次版本  
  10.     WORD wSuiteMask;                      //标识系统上的程序组  
  11.     BYTE wProductType;                    //标识系统类型  
  12.     BYTE wReserved;                         //保留,未使用  
  13. } OSVERSIONINFOEX, *POSVERSIONINFOEX;  

接着在调用函数之前先初始化结构的大小并调用函数,返回true表示成功:
[cpp] view plain copy
  1. OSVERSIONINFOEX os;  
  2. os.dwOSVersionInfoSize=sizeof(os);  
  3. if(!GetVersionEx((OSVERSIONINFO *)&os))  
  4. {  
  5.       return FALSE;  
  6. }  

函数调用成功以后就可以通过OSVERSIONINFOEX来查看系统的版本信息了。
根据微软操作系统编号发现windows 8 对应的windows version number是6.2
如下: 
Operating system Version number
Windows 8 6.2
Windows 7 6.1
Windows Server 2008 R2 6.1
Windows Server 2008 6.0
Windows Vista 6.0
Windows Server 2003 R2 5.2
Windows Server 2003 5.2
Windows XP 5.1
Windows 2000 5.0

下面是一个通过系统版本来判断操作系统名称的例子:

[cpp] view plain copy
  1. CString getSystemName()  
  2. {  
  3.     SYSTEM_INFO info;                //用SYSTEM_INFO结构判断64位AMD处理器  
  4.     GetSystemInfo(&info);            //调用GetSystemInfo函数填充结构  
  5.     OSVERSIONINFOEX os;  
  6.     os.dwOSVersionInfoSize=sizeof(OSVERSIONINFOEX);   
  7.     if(GetVersionEx((OSVERSIONINFO *)&os))                    
  8.     {  
  9.         CString vname;  
  10.   
  11.         //下面根据版本信息判断操作系统名称  
  12.         switch(os.dwMajorVersion){                        //判断主版本号  
  13.             case 4:  
  14.                 switch(os.dwMinorVersion){                //判断次版本号  
  15.                     case 0:  
  16.                         if(os.dwPlatformId==VER_PLATFORM_WIN32_NT)  
  17.                             vname=_T("Microsoft Windows NT 4.0");  //1996年7月发布  
  18.                         else if(os.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS)  
  19.                             vname=_T("Microsoft Windows 95");  
  20.                         break;  
  21.                     case 10:  
  22.                         vname=_T("Microsoft Windows 98");  
  23.                         break;  
  24.                     case 90:  
  25.                         vname=_T("Microsoft Windows Me");  
  26.                         break;  
  27.                 }  
  28.                 break;  
  29.             case 5:  
  30.                 switch(os.dwMinorVersion){               //再比较dwMinorVersion的值  
  31.                     case 0:  
  32.                         vname=_T("Microsoft Windows 2000");    //1999年12月发布  
  33.                         break;  
  34.                     case 1:  
  35.                         vname=_T("Microsoft Windows XP");      //2001年8月发布  
  36.                         break;  
  37.                     case 2:  
  38.                         if(os.wProductType==VER_NT_WORKSTATION &&   
  39.                            info.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)  
  40.                             vname=_T("Microsoft Windows XP Professional x64 Edition");  
  41.                         else if(GetSystemMetrics(SM_SERVERR2)==0)  
  42.                             vname=_T("Microsoft Windows Server 2003");   //2003年3月发布  
  43.                         else if(GetSystemMetrics(SM_SERVERR2)!=0)  
  44.                             vname=_T("Microsoft Windows Server 2003 R2");  
  45.                         break;  
  46.                 }  
  47.                 break;  
  48.             case 6:  
  49.                 switch(os.dwMinorVersion){  
  50.                     case 0:  
  51.                         if(os.wProductType==VER_NT_WORKSTATION)  
  52.                             vname=_T("Microsoft Windows Vista");  
  53.                         else  
  54.                             vname=_T("Microsoft Windows Server 2008");   //服务器版本  
  55.                         break;  
  56.                     case 1:  
  57.                         if(os.wProductType==VER_NT_WORKSTATION)  
  58.                             vname=_T("Microsoft Windows 7");  
  59.                         else  
  60.                             vname=_T("Microsoft Windows Server 2008 R2");  
  61.                         break;  
  62.             case 2:  
  63.                 vname=_T("Microsoft Windows 7");  
  64.             break;  
  65.                 }  
  66.                 break;  
  67.             default:  
  68.                 vname=_T("未知操作系统");  
  69.         }  
  70.         return vname;  
  71.     }  
  72.     else  
  73.         return _T("");  
  74. }  

以上只能判断操作系统的名称,那如何判断它是什么版本的呢(如Home版或Professional版)。
下面这个函数就返回具体的版本名称:
[cpp] view plain copy
  1. CString getVersionMark()  
  2. {  
  3.     OSVERSIONINFOEX os;  
  4.     os.dwOSVersionInfoSize=sizeof(OSVERSIONINFOEX);  
  5.     if(GetVersionEx((OSVERSIONINFO *)&os)){  
  6.         CString vmark;  
  7.   
  8.         switch(os.dwMajorVersion){                //先判断操作系统版本  
  9.             case 5:  
  10.                 switch(os.dwMinorVersion){  
  11.                     case 0:                  //Windows 2000  
  12.                         if(os.wSuiteMask==VER_SUITE_ENTERPRISE)  
  13.                             vmark=_T("Advanced Server");  
  14.                         break;  
  15.                     case 1:                  //Windows XP  
  16.                         if(os.wSuiteMask==VER_SUITE_EMBEDDEDNT)  
  17.                             vmark=_T("Embedded");  
  18.                         else if(os.wSuiteMask==VER_SUITE_PERSONAL)  
  19.                             vmark=_T("Home Edition");  
  20.                         else  
  21.                             vmark=_T("Professional");  
  22.                         break;  
  23.                     case 2:  
  24.                         if(GetSystemMetrics(SM_SERVERR2)==0 && /  
  25.   
  26.                         os.wSuiteMask==VER_SUITE_BLADE)  //Windows Server 2003  
  27.                             vmark=_T("Web Edition");  
  28.                         else if(GetSystemMetrics(SM_SERVERR2)==0 &&   
  29.                         os.wSuiteMask==VER_SUITE_COMPUTE_SERVER)  
  30.                             vmark=_T("Compute Cluster Edition");  
  31.                         else if(GetSystemMetrics(SM_SERVERR2)==0 &&   
  32.                         os.wSuiteMask==VER_SUITE_STORAGE_SERVER)  
  33.                             vmark=_T("Storage Server");  
  34.                         else if(GetSystemMetrics(SM_SERVERR2)==0 &&   
  35.                         os.wSuiteMask==VER_SUITE_DATACENTER)  
  36.                             vmark=_T("Datacenter Edition");  
  37.                         else if(GetSystemMetrics(SM_SERVERR2)==0 &&   
  38.                         os.wSuiteMask==VER_SUITE_ENTERPRISE)  
  39.                             vmark=_T("Enterprise Edition");  
  40.                         else if(GetSystemMetrics(SM_SERVERR2)!=0 &&   
  41.                            os.wSuiteMask==VER_SUITE_STORAGE_SERVER)   
  42.                             vmark=_T("Storage Server");  
  43.                         break;  
  44.                 }  
  45.                 break;  
  46.             case 6:  
  47.                 switch(os.dwMinorVersion){  
  48.                     case 0:  
  49.                         if(os.wProductType!=VER_NT_WORKSTATION &&   
  50.                         os.wSuiteMask==VER_SUITE_DATACENTER)   
  51.                             vmark=_T("Datacenter Server");  
  52.                         else if(os.wProductType!=VER_NT_WORKSTATION &&   
  53.                         os.wSuiteMask==VER_SUITE_ENTERPRISE)  
  54.                             vmark=_T("Enterprise");  
  55.                         else if(os.wProductType==VER_NT_WORKSTATION &&   
  56.                            os.wSuiteMask==VER_SUITE_PERSONAL)  //Windows Vista  
  57.                             vmark=_T("Home");  
  58.                         break;  
  59.                 }  
  60.                 break;  
  61.             default:  
  62.                 vmark=_T("");  
  63.         }  
  64.         return vmark;  
  65.     }  
  66.     else  
  67.         return _T("");  
  68. }  

另外,操作系统的补丁包名称也可以从szCSDVersion直接获取。

你可能感兴趣的:(GetVersionEx 获取系统版本信息)