GetVersionEx 獲取系統版本信息

轉自:http://blog.csdn.net/yyingwei/article/details/8286658


最近在windows 8上獲取系統版本信息需要調用系統API,于是用到了GetVersionEx。

首先看一看函數原型:

[cpp]?view plaincopy
  1. BOOL?GetVersionEx(POSVERSIONINFO?pVersionInformation);??

結構OSVERSIONINFOEX定義如下:

[cpp]?view plaincopy
  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 plaincopy
  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 plaincopy
  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 plaincopy
  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直接獲取。

FYI

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458679.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458679.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458679.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

popoverController(iPad)

一、設置尺寸 提示:不建議,像下面這樣吧popover的寬度和高度寫死。 1 //1.新建一個內容控制器2 YYMenuViewController *menuVc[[YYMenuViewController alloc]init];3 4 //2.新建一個popoverController,并設置其內容控制器5 s…

靜態成員變量和非靜態成員變量的對比

靜態成員變量和非靜態成員變量的對比 1、存儲的數據 靜態成員變量存儲的是所有對象共享的數據 非靜態成員變量存儲的是每個對象特有的數據 2、存儲位置 靜態成員變量是隨著類的加載在方法區的靜態區開辟內存了 非靜態成員變量是隨著對象的創建再堆中開辟內存 3、調用方式 靜態成…

c++的thread類(c++線程簡單用法)

最近看了一個Thread類(忘記在哪里看的了),感覺不錯。 創建線程時線程對應的函數必須是類的靜態成員,由于靜態成員無法訪問類的非靜態成員,我從前都是把對象的指針作為參數傳遞給線程函數來避免這個問題,但是…

[LeetCode]Merge Sorted Array

題目描述:(鏈接) Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note:You may assume that nums1 has enough space (size that is greater or equal to m n) to hold additional elements from nums2. The number of eleme…

[LeetCode]Integer to Roman

題目描述:(鏈接&#xff09; Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 to 3999. 解題思路&#xff1a; 1 class Solution {2 public:3 string intToRoman(int num) {4 vector<int> values{1000…

[c++]代理對象模式

代理對象 <code class"hljs cpp has-numbering" style"display: block; padding: 0px; box-sizing: border-box; font-family: Source Code Pro, monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius:…

this static 面向對象三大特點

面向對象三大特點&#xff1a;封裝、繼承、多態 封裝&#xff1a;只對外界提供有用的屬性和行為 this&#xff1a;是一個引用&#xff0c;總是指向當前對象 static 存放位置是方法區中的靜態區 static特點 static修飾的成員變量隨著類的加載就在靜態區中開辟內存 所…

fastQC

Fastqc用途 FastQC aims to provide a simple way to do some quality control checks on raw sequence data coming from high throughput sequencing pipelines. It provides a modular set of analyses which you can use to give a quick impression of whether your data …

C++代理 Surrogate

容器通常只能包含一種類型的對象&#xff0c;所以很難在容器中存儲對象本身。存儲指向對象的指針&#xff0c;雖然允許通過繼承來處理類型不同的問題&#xff08; 多態性 &#xff09;&#xff0c;但是也增加了內存分配的額外負擔。所以我們通過定義名為 代理 的對象來解決該問…

C++ Handle(句柄) part1

本文是我學習C&#xff0b;&#xff0b;沉思錄第6章的筆記 本文主要講述了Handle類的概念&#xff0c;定義方法以及寫時復制技術。 在前文(Surrogate代理類)的講解中我們了解到了代理的實現方法. 代理類有很多好處,但是麻煩的是每次都得進行復制.如果該類是經常使用并且member很…

sscanf的高級用法

sscanf的高級用法&#xff08;總結&#xff09; 2012-04-25 18:50:25分類&#xff1a; C/C sscanf(recvbuf,"%*[^/]/%[^ ]s",buf_rev); sscanf(buf, "GET /%[^ ]", buf_rev);這個是在一個webserver.c里面的例子&#xff0c;通過sscanf&#xff08;&#xf…

選擇排序 冒泡排序 二分查找

選擇排序 int [] arr {2,48,28,32,90,12}; for&#xff08;int i 0&#xff1b; i < arr.length - 1;i&#xff09;{ for(int j i 1; j < arr.length;j){ if(arr[i] < arr[j]){ int c; c arr[i]; arr[i] arr[j]; arr[j] c; } } } 冒泡排序 for(int i 0;i <…

C++, ID、指針、handle (void *)的區別

原文鏈接&#xff1a; http://hi.baidu.com/dandanfeng160/blog/item/4eaa3df5215bc42dbd310955.html 在Windows程序設計中&#xff0c;句柄是無法精確定義的術語。隨便找一個高手&#xff0c;讓他給你講講句柄是什么&#xff0c;恐怕他都很難給你一個具體的定義來。 在Wind…

Swift調用Objective C的FrameWork

很多Github的庫經過很多年的發展&#xff0c;源碼都是OC寫的&#xff0c;&#xff0c;所以&#xff0c;用Swift調用OC的庫就是開發中難免遇到的的一個問題&#xff0c;本文以AFNetworking為例&#xff0c;講解如何跨語言調用。 第一步 創建一個空的工程 注意&#xff0c;語言選…

命令行 java文本編輯工具 重載 內存區域 棧 堆

一、dir 列出當前目錄下的文件以及文件夾 md創建目錄 rd刪除目錄 cd 進入指定目錄 cd..返回到上一級目錄 &#xff1a; 切換盤符 比如&#xff1a; F: 二、editPlus 編寫程序 三、重載&#xff1a;在同一個class中&#xff0c;出現了函數名稱相同&#xff0…

數據結構(Java)——查找和排序(1)

1.查找的定義 查找是這樣一個過程&#xff0c;即在某個項目組中尋找某一指定目標元素&#xff0c;或者確定該組中并不存在該目標元素。 對其進行查找的項目的組有時也成為查找池。兩種常見的查找方式&#xff1a;線性查找和二分查找。為了能夠查找某一對象&#xff0c;我們就必…

GetProcAddress()用法

函數功能描述: GetProcAddress()函數檢索指定的動態鏈接庫(DLL)中的輸出庫函數地址。 函數原型&#xff1a; FARPROC GetProcAddress( HMODULE hModule, // DLL模塊句柄 LPCSTR lpProcName // 函數名 ); 參數&#xff1a; hModule [in] 包含此函數的…

支付寶問題LaunchServices: ERROR: There is no registered handler for URL scheme alipay

LaunchServices: ERROR: There is no registered handler for URL scheme alipay &#xff08;這句話其實是在告訴你 設備上沒有安裝 支付寶的客戶端,此時會走網頁端&#xff09;而有人會發現并沒有HTML5網頁彈出過一會&#xff0c;會發現服務器返回4000支付失敗&#xff0c;這…

C++string類常用函數 c++中的string常用函數用法總結

string類的構造函數&#xff1a; string(const char *s); //用c字符串s初始化 string(int n,char c); //用n個字符c初始化 此外&#xff0c;string類還支持默認構造函數和復制構造函數&#xff0c;如string s1&#xff1b;string s2"hello"&#xff1b;都是正…

排列與組合

話說&#xff0c;初一的時候看到這樣一道題&#xff1a;有一種彩票中獎率為1%&#xff0c;買一百張是不是一定能中獎&#xff1f;答案自然是否定的&#xff0c;但我在想&#xff0c;如果有200張彩票&#xff0c;兩張有獎&#xff0c;買一百張中獎率是多少&#xff1f;一天晚上睡…