GetVersionEx 获取系统版本信息

API 中有两个函数可以得到系统版本信息:GetVersion和GetVersionEx。    。     
 为了解决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);  
/*在调用函数前必须用sizeof(OSVERSIONINFOEXA)填充dwOSVersionInfoSize结构成员*/ 
if(GetVersionEx((OSVERSIONINFO *)&os))               
/*调用GetVersionEx函数OSVERSIONINFOEX结构必须将指针类型强制转换*/    {   
CString vname;         //下面根据版本信息判断操作系统名称     





SYSTEM_INFO _systemInfo;
GetSystemInfo(&_systemInfo);
OSVERSIONINFOEX _osVersionInfo;
string vname = "";
_osVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
GetVersionEx((LPOSVERSIONINFO)&_osVersionInfo);
//
switch (_osVersionInfo.dwMajorVersion) //系统名称
{                      



case 4:
switch (_osVersionInfo.dwMinorVersion)
{
//判断次版本号                     
case 0:
if (_osVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
vname = "Microsoft Windows NT 4.0";                //1996年7月发布        
else if (_osVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
vname = "Microsoft Windows 95";
break;
case 10:
vname = "Microsoft Windows 98";
break;
case 90:
vname = "Microsoft Windows Me";
break;
}
break;
case 5:
switch (_osVersionInfo.dwMinorVersion)
{               //再比较dwMinorVersion的值      
case 0:
vname = "Microsoft Windows 2000";
//1999年12月发布                         
break;
case 1:
vname = "Microsoft Windows XP";                    //2001年8月发布           
break;
case 2:
if (_osVersionInfo.wProductType == VER_NT_WORKSTATION &&
_systemInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
vname = "Microsoft Windows XP Professional x64 Edition";
else if (GetSystemMetrics(SM_SERVERR2) == 0)
vname = "Microsoft Windows Server 2003";        //2003年3月发布       
else if (GetSystemMetrics(SM_SERVERR2) != 0)
vname = "Microsoft Windows Server 2003 R2";
break;
}
break;
case 6:
switch (_osVersionInfo.dwMinorVersion)
{
case 0:
if (_osVersionInfo.wProductType == VER_NT_WORKSTATION)/*
 VER_NT_WORKSTATION是桌面系统 */
vname = "Microsoft Windows Vista";
else
vname = "Microsoft Windows Server 2008";          //服务器版本       
break;
case 1:
if (_osVersionInfo.wProductType == VER_NT_WORKSTATION)
vname = "Microsoft Windows 7";
else
vname = "Microsoft Windows Server 2008 R2";
break;
case 2:
if (_osVersionInfo.wProductType == VER_NT_WORKSTATION)
{
vname = "Windows 8";
}
else
{
vname = "Windows Server 2012";
}
break;
case 3:
if (_osVersionInfo.wProductType==VER_NT_WORKSTATION)
{
vname = "Windows 8.1";
}
else
{
vname = "Windows Server 2012 R2";
}
break;
default:
vname = "未知操作系统";
}                
break;




case 10:
switch (_osVersionInfo.dwMinorVersion)
{
case 0:
if (_osVersionInfo.wProductType==VER_NT_WORKSTATION)
{
vname = "Windows 10";
}
else
{
vname = "Windows Server 2016";
}
break;
default:
break;
}
break;
default:
vname = "未知操作系统";








}



 
 
 
 
下面这个函数就返回具体的版本名称: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)  /*                           Windows Server 2003 R2*/   
vmark=_T("Storage Server");                         break;                 }                 break;    
case 6:                 switch(os.dwMinorVersion){                     case 0:                    
if(os.wProductType!=VER_NT_WORKSTATION && /                        os.wSuiteMask==VER_SUITE_DATACENTER)  /*  
Windows Server 2008*/                             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("");}
 
 
 
 
 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值