轉自:http://blog.csdn.net/yyingwei/article/details/8286658
最近在windows 8上獲取系統版本信息需要調用系統API,于是用到了GetVersionEx。
首先看一看函數原型:
[cpp]?view plaincopy
- BOOL?GetVersionEx(POSVERSIONINFO?pVersionInformation);??
結構OSVERSIONINFOEX定義如下:
[cpp]?view plaincopy
- 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 plaincopy
- 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 plaincopy
- 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 plaincopy
- 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直接獲取。
FYI