获取操作系统名称和版本

以下内容为转载,(最后内容为个人新增)

 原文作者:http://blog.sina.com.cn/s/blog_49764fbb0100r29v.html


先看这个:http://tieba.baidu.com/f?kz=859123733说的是什么是SP1 sp2 sp3....
Windows XP Service Pack 的版本简称SP
通俗地说:微软的漏洞补丁集合包补丁到一定数量 他们就会做补丁包
叫SP1 让大家不用一个一个的去打了
再攒攒 就出SP2了


SP是Service Pack的缩写,它是一个补丁包,里面以前包括所有的安全补丁,还有一个系统方面的改善,微软会定期发布SP。 
windows XP 是微软windows操作系统之一,由于XP使用一段时间后,发现有很多的漏洞和BUG,所以微软为了防止系统受到攻击和增加稳定性就打上了SP1补丁!后现又发现了windows XP sp1的重大漏洞(比如冲击波/震荡波),所以微软再进一步打上SP2补丁已增加系统的安全和稳定。
 
SP2将增设众多功能来为用户提供安全保障。首先,增设了Windows防火墙,来增强对PC的保护,抵御病毒以及那些尝试通过Internet访问PC的入侵者。此外,未经用户的同意,大多数由Web站点弹出的浏览器窗口将被关闭;Outlook Express支持新的附件管理器,它能够在用户打开附件时对其进行隔离,从而避免接收到不请自来的电子邮件消息。微软(中国)有限公司副总经理孙建东表示:“SP2已经不再是简单意义上的服务包,它融合了很先进的技术。”按照孙的介绍,SP2提供了增强无线支持特性,可以简化无线网络的发现与连接方式。最后,SP2里面包含了最新的DirectX9.0C。


为了支持更新的功能,SP2更加臃肿,更难侍侯了。一般电脑的256M内存,刚进系统就已经被剥削的七七八八,所剩无几了。在不增加物理内存的情况下,我们建议大家加大虚拟内存,和尽可能的优化系统,关闭一些自己不需要的服务和进程


Windows XP Service Pack 3 (SP3) 包含以前发布的所有 Windows XP 更新,包括安全更新和修补程序。其中还包括选择带外版本,以及少量新的增强功能,它们不会显著更改客户对操作系统的体验。


基本上,部署 Windows XP SP3 与部署 Windows XP SP1 和 Windows XP SP2 相同: 
 • SP3 是累积的,因此用户可以在 Windows XP SP1 或 SP2 的基础上安装 SP3。
 • Windows XP SP3 支持的语言与 Windows XP 的初始版本中的语言相同。 
• 可以在任何版本的 Windows XP SP1 或 SP2 上运行 SP3 更新程序包。例如,可以在运行带有 SP1 的 Windows XP Media Center Edition 的计算机上运行 SP3 更新程序包。但 Embedded 版本的 XP 除外。
 • 系统管理员的工具和指南基本上与 Windows XP SP2 相同。有关综合信息,请访问 Microsoft TechNet 上的 Deploy Windows XP Professional 和 Windows XP Service Pack 2 Deployment Information 站点。
 • 可以使用 Microsoft 系统管理服务器 2003、Microsoft 系统中心配置管理器 2007 或第三方解决方案部署 SP3。这个过程基本上没有改变。 Windows XP SP3 仅用于 x86 版本的 Windows XP。x64 版本的 Windows XP 由 Windows Server 2003 SP2 服务。有关其他信息,请访问 Windows Server 2003 Service Pack 2。


XP系统版本越新越高,文件也就起越大,所以对电脑配置也越高。如果你是7年前买的电脑,而且没有对它进行升级,最好安装sp1, 增加内存后勉强可以安装sp2


全新安装完操作系统并安装完驱动与软件。重新启动进入系统后,清除所有临时文件、Cookies,整理磁盘碎片。然后在进入系统选择列表后,从选择系统按回车的同时开始计时,到进入系统,所有要load的进程、服务、程序load完停止计时。 
测试的结果很明显,虽然带有一定的人为因素的影响,但是SP2与SP1接近10秒的差距已经超出了误差的范围。SP2由于需要加载防火墙、安全中心等等一系列程序,使得开机速度慢了不少。 
内存占用对比:对于只有256M内存的用户来说,系统本身占用的内存空间也是一个比较敏感的因素,所以我们把SP1与SP2进入系统之后的内存占有情况作出以下列表: 
SP1 进系统后可用的物理内存数为115464K;使用了138M的虚拟内存;有25个进程在运行 进系统后可用的物理内存数为94628K;使用了159M的虚拟内存;有28个进程在运行 
SP2 进系统后我们发现可用的物理内存数SP2比SP1少了20836K,近20M的内存;SP2使用了159M的虚拟内存,比SP1多使用了了21M;SP2有28个进程在运行比SP1多了3个,也可以从一个角度反应了为什么SP2进系统比SP1慢了差不多10秒 


全新安装完操作系统并安装完驱动与软件。重新启动进入系统后,清除所有临时文件、C 
内存占用对比:对于只有256M内存的用户来说,系统本身占用的内存空间也是一个比较敏感的因素,所以我们把SP1与SP2进入系统之后的内存占有情况作出以下列表: 
SP1 进系统后可用的物理内存数为115464K;使用了138M的虚拟内存;有25个进程在运行 进系统后可用的物理内存数为94628K;使用了159M的虚拟内存;有28个进程在运行 
SP2 进系统后我们发现可用的物理内存数SP2比SP1少了20836K,近20M的内存;SP2使用了159M的虚拟内存,比SP1多使用了了21M;SP2有28个进程在运行比SP1多了3个,也可以从一个角度反应了为什么SP2进系统比SP1慢了差不多10秒 


对于只有256M内存的用户来说,系统本身占用的内存空间也是一个比较敏感的因素,所以我们把SP1与SP2进入系统之后的内存占有情况作出以下列表: 
SP1 进系统后可用的物理内存数为115464K;使用了138M的虚拟内存;有25个进程在运行 进系统后可用的物理内存数为94628K;使用了159M的虚拟内存;有28个进程在运行 
SP2 进系统后我们发现可用的物理内存数SP2比SP1少了20836K,近20M的内存;SP2使用了159M的虚拟内存,比SP1多使用了了21M;SP2有28个进程在运行比SP1多了3个,也可以从一个角度反应了为什么SP2进系统比SP1慢了差不多10秒 




WindowsAPI使用详解——GetVersion|GetVersionEx 获取操作系统版本和名称
转载自:http://bbs.7boo.com.cn/thread-8093-1-1.html


AF注:
TCHAR cstCSDVersion[128];
sprintf(cstCSDVersion,"%s",os.szCSDVersion);//spk
Windows API 中有两个函数可以得到系统版本信息:GetVersion和GetVersionEx。
      GetVersion这个函数曾经困扰了很多程序员,其本来设计的是在DWORD返回值中用低位的那个字表示MS-DOS的版本号,高位的那个字表示Windows版本号。对于每个字来说,高位字节代表主要版本号,低位字节代表次要版本号。可是因为编写此函数的程序员犯了一个错误,使得此函数返回的Windows版本号颠倒了(即把主要版本号放到了低位字节,而次要版本号放到了高位字节)。当发现此错误的时候已经有很多程序员在使用这个函数了,Microsoft只好将错就错,直接把原来的API文档给改了过来。
      为了解决GetVersion带来的问题,Microsoft后来开发了一个新的函数GetVersionEx,用它能够得到更详细的Windows系统的版本信息,下面我就写写GetVersionEx的使用方法。


函数原型:
BOOL GetVersionEx(POSVERSIONINFO pVersionInformation);
我们先来看看OSVERSIONINFOEX这个结构:
typedef struct {
DWORD dwOSVersionInfoSize;       //在使用GetVersionEx之前要将此初始化为结构的大小
DWORD dwMajorVersion;               //系统主版本号
DWORD dwMinorVersion;               //系统次版本号
DWORD dwBuildNumber;               //系统构建号
DWORD dwPlatformId;                  //系统支持的平台(详见附1)
TCHAR szCSDVersion[128];          //系统补丁包的名称
WORD wServicePackMajor;            //系统补丁包的主版本
WORD wServicePackMinor;            //系统补丁包的次版本
WORD wSuiteMask;                      //标识系统上的程序组(详见附2)
BYTE wProductType;                    //标识系统类型(详见附3)
BYTE wReserved;                         //保留,未使用
} OSVERSIONINFOEX, *POSVERSIONINFOEX;
这个结构在Windows 2000后出现,老版本的OSVERSIONINFO结构没有wServicePackMajor、wServicePackMinor、wSuiteMask、wProductType和wReserved这几个成员。


接着在调用函数之前先初始化结构的大小:
OSVERSIONINFOEX os;
os.dwOSVersionInfoSize=sizeof(os);
函数返回值为TRUE表示成功:
if(!GetVersionEx((OSVERSIONINFO *)&os))
{
      return FALSE;
}
复制代码
函数调用成功以后就可以通过OSVERSIONINFOEX来查看系统的版本信息了。


下面是一个通过系统版本来判断操作系统名称的例子:
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; 
                } 
                break; 
            default: 
                vname=_T("未知操作系统"); 
        } 
        return vname; 
    } 
    else 
        return _T("");
}
复制代码
以上只能判断操作系统的名称,那如何判断它是什么版本的呢(如Home版或Professional版)。
下面这个函数就返回具体的版本名称:
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直接获取。
程序编译出来后大家可以用不同版本的兼容模式运行这个程序,来检测结果是不是正确,兼容模式会欺骗GetVersionEx这些API函数,拿Windows 98 兼容模式来说,程序会以为自己是在Windows 98 上运行。
有什么问题请给我留言,如果在本页面下发没有看到有留言请刷新一下页面。


附1:dwPlatformId的值:
VER_PLATFORM_WIN32s (Win32s),
VER_PLATFORM_WIN32_WINDOWS (Windows 95/Windows 98),
VER_PLATFORM_WIN32_NT (Windows NT/Windows 2000),
VER_PLATFORM_WIN32_CEHH (Windows CE).
附2:wSuiteMask的值:
VER_SUITE_SMALLBUSINESS,
VER_SUITE_ENTERPRISE,
VER_SUITE_BACKOFFICE,
VER_SUITE_COMMUNICATIONS,
VER_SUITE_TERMINAL,
VER_SUITE_SMALLBUSINESS_RESTRICTED,
VER_SUITE_EMBEDDEDNT,
VER_SUITE_DATACENTER.
附3:wProductType的值:
VER_NT_WORKSTATION,
VER_NT_SERVER,
VER_NT_DOMAIN_CONTROLLER.


................................................................................................................................................

以下内容原创

以上版本判断不包含win8及以后

版本6.2:

首先读取注册表的系统名称(后面说),如果没有读取到:

os.wProductType == VER_NT_WORKSTATIOn ->Windows 8

否则 windows server 2012

版本6.3同上,对应版本windows 8.1 windows server 2012 R2

        win10的判断及将发布的2016暂时未研究出结果

        以下是读取注册表系统名称的问题

  

bool GetWin8dot1Name(std::string& strName)
{
bool bRet = true;
do 
{
#ifdef WIN32
HKEY hKey = NULL;
LONG lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
REG_K,
0, KEY_ALL_ACCESS, &hKey);
if (ERROR_SUCCESS != lResult)
{
if (NULL != hKey)
{
lResult = RegCloseKey(hKey);
hKey = NULL;
}
bRet = false;
break;
}


DWORD dwType = 0;
char szSystemName[MAX_PATH] = {0};
DWORD dwSize = sizeof(szSystemName) / sizeof(szSystemName[0]);
lResult = RegQueryInfoKeyA(hKey, "ProductName", NULL, &dwType, (LPBYTE)szSystemName, (DWORD*)&dwSize);
if (ERROR_SUCCESS != hKey)
{
//同上;
}
strName = szSystemName;
RegCloseKey(hKey);


#endif
} while (0);


return bRet;
}

你可能感兴趣的:(win32,MFC/DLL)