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.mzph.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;一天晚上睡…