为了解决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("");}