当前位置:C++技术网 > 资讯 > 轻轻松松获取操作系统的版本信息(获取系统版本号和SP版本等)

轻轻松松获取操作系统的版本信息(获取系统版本号和SP版本等)

更新时间:2016-03-15 20:59:52浏览次数:1+次

    今天来写个程序查看我们的操作系统的一些信息,包括系统的版本号,构建版本号,系统的平台是不是NT系统平台,Service Pack包是什么版本或者看看有没有安装SP包。至于其他的信息,则包含了系统套装版本,如家庭版、企业版,还有系统的类型,如工作站还是服务器系统。

    下面是运行的截图:

检测电脑的操作系统的版本信息

【检测电脑的操作系统的版本信息】
    我们使用的函数是GetVersionEx,这个函数就是简单的将系统信息存入一个结构体中,使用非常简单。
    重点的是了解一下结构体的信息。这个结构体就是OSVERSIONINFO(EX),Ex版本的结构体包含的信息更多,所以我们就用这个来了解。
    下面是OSVERSIONINFOEX结构体的声明:
typedef struct _OSVERSIONINFOEX {
  DWORD dwOSVersionInfoSize;//结构体大小
  DWORD dwMajorVersion;//主版本号
  DWORD dwMinorVersion;//次版本号
  DWORD dwBuildNumber; //构建版本
  DWORD dwPlatformId;  //系统平台ID,VER_PLATFORM_WIN32_NT
  TCHAR szCSDVersion[128];//SP(ServicePack)包版本
  WORD  wServicePackMajor;//SP包主版本号,从这一个成员开始,是EX结构体才有的
  WORD  wServicePackMinor;//SP包次版本号
  WORD  wSuiteMask;   //系统套装如家庭版、企业版
  BYTE  wProductType; //产品类型,工作站、服务器等
  BYTE  wReserved;//保留不用
} OSVERSIONINFOEX;

    结构体的基本的成员含义,已经标注出来了。也不多解释了。那么在使用这个结构体前需要注意一些地方。
    GetVersionEx函数只能使用OSVERSIONINFO,不能使用EX版本。如果你要使用EX版本,可以自己看看VerifyVersionInfo函数。而这个结构体使用前需要将第一个成员函数设置一下,然后再传给GetVersionEx函数。在Windows中,第一个成员是指定结构体大小的结构体,一定要先设置这个结构体大小成员,再使用。即使你只是拿来接受数据的,也是需要设置这个大小。设置之后,才能正确的接受数据,否则可能会出现问题。
    对于szCSDVersion[128]成员是一个字符数组,但是要注意,如果你的项目字符集是Unicode,那么字符串就是宽字符版本,使用cout或者printf是无法直接输出的。那么你可以修改项目的字符集,在【项目】->【配置属性】->【常规】->【字符集】,选择“使用多字节字符集”,然后就可以使用cout和printf输出了。当然,字符集是Unicode时,你也可以使用宽字符版本的函数来输出,可以查看MSDN,如printf可以用它的宽字符版本wprintf,或者中性版本_tprintf。不要问我为什么知道,你在MSDN中输入printf,自然就知道了。
    下面是完整的代码:
#include <windows.h>
#include <iostream>
using namespace std;
int main()
{
    OSVERSIONINFO osvi;
    memset(&osvi,0,sizeof(OSVERSIONINFO));
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    GetVersionEx(&osvi);
    cout<<"系统版本:"<<osvi.dwMajorVersion<<"."<<osvi.dwMinorVersion<<endl;
    cout<<"构建版本:"<<osvi.dwBuildNumber<<endl;
    if (osvi.dwPlatformId==2)
    {
        cout<<"系统平台:NT系统平台"<<endl;
    }else
    {
        cout<<"系统平台:非NT系统平台"<<endl;
    }
    wprintf(osvi.szCSDVersion);//unicode字符集版
    //cout<<"SP版本:"<<osvi.szCSDVersion<<endl;//多字节字符集版
}