GetVersionEx 獲取系統版本信息

最近在windows 8上獲取系統版本信息需要調用系統API,於是用到了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直接獲取。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章