GetVersionEx 获取系统版本信息

    xiaoxiao2021-12-14  18

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

    首先看一看函数原型:

    [cpp]  view plain  copy BOOL GetVersionEx(POSVERSIONINFO pVersionInformation);   结构OSVERSIONINFOEX定义如下:

    [cpp]  view plain  copy typedef struct {       DWORD dwOSVersionInfoSize;       //在使用GetVersionEx之前要将此初始化为结构的大小       DWORD dwMajorVersion;               //系统主版本号       DWORD dwMinorVersion;               //系统次版本号       DWORD dwBuildNumber;               //系统构建号       DWORD dwPlatformId;                  //系统支持的平台       TCHAR szCSDVersion[128];          //系统补丁包的名称       WORD wServicePackMajor;            //系统补丁包的主版本       WORD wServicePackMinor;            //系统补丁包的次版本       WORD wSuiteMask;                      //标识系统上的程序组       BYTE wProductType;                    //标识系统类型       BYTE wReserved;                         //保留,未使用   } OSVERSIONINFOEX, *POSVERSIONINFOEX;   接着在调用函数之前先初始化结构的大小并调用函数,返回true表示成功:

    [cpp]  view plain  copy OSVERSIONINFOEX os;   os.dwOSVersionInfoSize=sizeof(os);   if(!GetVersionEx((OSVERSIONINFO *)&os))   {         return FALSE;   }   函数调用成功以后就可以通过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 CString getSystemName()   {       SYSTEM_INFO info;                //用SYSTEM_INFO结构判断64位AMD处理器       GetSystemInfo(&info);            //调用GetSystemInfo函数填充结构       OSVERSIONINFOEX os;       os.dwOSVersionInfoSize=sizeof(OSVERSIONINFOEX);        if(GetVersionEx((OSVERSIONINFO *)&os))                         {           CString vname;              //下面根据版本信息判断操作系统名称           switch(os.dwMajorVersion){                        //判断主版本号               case 4:                   switch(os.dwMinorVersion){                //判断次版本号                       case 0:                           if(os.dwPlatformId==VER_PLATFORM_WIN32_NT)                               vname=_T("Microsoft Windows NT 4.0");  //1996年7月发布                           else if(os.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS)                               vname=_T("Microsoft Windows 95");                           break;                       case 10:                           vname=_T("Microsoft Windows 98");                           break;                       case 90:                           vname=_T("Microsoft Windows Me");                           break;                   }                   break;               case 5:                   switch(os.dwMinorVersion){               //再比较dwMinorVersion的值                       case 0:                           vname=_T("Microsoft Windows 2000");    //1999年12月发布                           break;                       case 1:                           vname=_T("Microsoft Windows XP");      //2001年8月发布                           break;                       case 2:                           if(os.wProductType==VER_NT_WORKSTATION &&                               info.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)                               vname=_T("Microsoft Windows XP Professional x64 Edition");                           else if(GetSystemMetrics(SM_SERVERR2)==0)                               vname=_T("Microsoft Windows Server 2003");   //2003年3月发布                           else if(GetSystemMetrics(SM_SERVERR2)!=0)                               vname=_T("Microsoft Windows Server 2003 R2");                           break;                   }                   break;               case 6:                   switch(os.dwMinorVersion){                       case 0:                           if(os.wProductType==VER_NT_WORKSTATION)                               vname=_T("Microsoft Windows Vista");                           else                               vname=_T("Microsoft Windows Server 2008");   //服务器版本                           break;                       case 1:                           if(os.wProductType==VER_NT_WORKSTATION)                               vname=_T("Microsoft Windows 7");                           else                               vname=_T("Microsoft Windows Server 2008 R2");                           break;               case 2:                   vname=_T("Microsoft Windows 7");               break;                   }                   break;               default:                   vname=_T("未知操作系统");           }           return vname;       }       else           return _T("");   }   以上只能判断操作系统的名称,那如何判断它是什么版本的呢(如Home版或Professional版)。 下面这个函数就返回具体的版本名称:

    [cpp]  view plain  copy CString getVersionMark()   {       OSVERSIONINFOEX os;       os.dwOSVersionInfoSize=sizeof(OSVERSIONINFOEX);       if(GetVersionEx((OSVERSIONINFO *)&os)){           CString vmark;              switch(os.dwMajorVersion){                //先判断操作系统版本               case 5:                   switch(os.dwMinorVersion){                       case 0:                  //Windows 2000                           if(os.wSuiteMask==VER_SUITE_ENTERPRISE)                               vmark=_T("Advanced Server");                           break;                       case 1:                  //Windows XP                           if(os.wSuiteMask==VER_SUITE_EMBEDDEDNT)                               vmark=_T("Embedded");                           else if(os.wSuiteMask==VER_SUITE_PERSONAL)                               vmark=_T("Home Edition");                           else                               vmark=_T("Professional");                           break;                       case 2:                           if(GetSystemMetrics(SM_SERVERR2)==0 && /                              os.wSuiteMask==VER_SUITE_BLADE)  //Windows Server 2003                               vmark=_T("Web Edition");                           else if(GetSystemMetrics(SM_SERVERR2)==0 &&                            os.wSuiteMask==VER_SUITE_COMPUTE_SERVER)                               vmark=_T("Compute Cluster Edition");                           else if(GetSystemMetrics(SM_SERVERR2)==0 &&                            os.wSuiteMask==VER_SUITE_STORAGE_SERVER)                               vmark=_T("Storage Server");                           else if(GetSystemMetrics(SM_SERVERR2)==0 &&                            os.wSuiteMask==VER_SUITE_DATACENTER)                               vmark=_T("Datacenter Edition");                           else if(GetSystemMetrics(SM_SERVERR2)==0 &&                            os.wSuiteMask==VER_SUITE_ENTERPRISE)                               vmark=_T("Enterprise Edition");                           else if(GetSystemMetrics(SM_SERVERR2)!=0 &&                               os.wSuiteMask==VER_SUITE_STORAGE_SERVER)                                vmark=_T("Storage Server");                           break;                   }                   break;               case 6:                   switch(os.dwMinorVersion){                       case 0:                           if(os.wProductType!=VER_NT_WORKSTATION &&                            os.wSuiteMask==VER_SUITE_DATACENTER)                                vmark=_T("Datacenter Server");                           else if(os.wProductType!=VER_NT_WORKSTATION &&                            os.wSuiteMask==VER_SUITE_ENTERPRISE)                               vmark=_T("Enterprise");                           else if(os.wProductType==VER_NT_WORKSTATION &&                               os.wSuiteMask==VER_SUITE_PERSONAL)  //Windows Vista                               vmark=_T("Home");                           break;                   }                   break;               default:                   vmark=_T("");           }           return vmark;       }       else           return _T("");   }   另外,操作系统的补丁包名称也可以从szCSDVersion直接获取。
    转载请注明原文地址: https://ju.6miu.com/read-962601.html

    最新回复(0)