VC++获取Widnows操作系统版本(附源码)
Posted dvlinker
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC++获取Widnows操作系统版本(附源码)相关的知识,希望对你有一定的参考价值。
有时候我们需要获取操作系统版本,比如win7、win8、win8.1、win10等,对不同版本的系统做特殊处理。有时我们还需要分辨当前系统是64位的,还是32位的。
调用API接口NetWkstaGetInfo可以获得系统的主版本好和次版本号,这样就能确定操作系统是win7还是win10系统了。在调用接口前,要包含lmwksta.h或Lm.h头文件,要引入Netapi32.lib库,可以在MSDN上查看NetWkstaGetInfo接口的说明页面,页面中有其依赖的头文件和库文件的说明,如下:
有人会说,为啥要调用NetWkstaGetInfo接口,这个接口我们都没刚听说过,应该调用GetVersionEx API接口,这个接口是专门用来获取操作系统版本的。实际上,GetVersionEx接口已经被微软废弃了,无法获取到操作系统真实的版本号了,MSDN上已明确该函数被废弃了:
至于如何确定系统是32位的还是64位的,我们可以调用API函数GetNativeSystemInfo来获取。注意此处的API函数是GetNativeSystemInfo,不是GetSystemInfo,使用GetSystemInfo是有问题的。
下面详细给出获取操作系统版本的代码,重点关注一下NetWkstaGetInfo和GetNativeSystemInfo两个API函数的调用:
CString GetOsName()
// 1、调用GetNativeSystemInfo确定系统是32位的还是64位的
SYSTEM_INFO info;
GetNativeSystemInfo(&info);
CString strOsVerName;
// 2、调用NetWkstaGetInfo获取系统的版本号
// 由于GetVersionEx在win8及以后系统获取的版本有问题,即使按照msdn中说明那样添加
// manifest支持文件,也会受程序的兼容模式影响,导致GetVersionEx获取的版本号不对
// 所以此处调用NetWkstaGetInfo获取系统的版本好
DWORD dwLevel = 100;
LPWKSTA_INFO_100 lpWkStaInfo100 = NULL;
NET_API_STATUS statusRet = NetWkstaGetInfo( NULL, dwLevel, (LPBYTE*)&lpWkStaInfo100 );
if ( statusRet == NERR_Success )
os.dwMajorVersion = lpWkStaInfo100->wki100_ver_major;
os.dwMinorVersion = lpWkStaInfo100->wki100_ver_minor;
// Free the allocated memory
if ( lpWkStaInfo100 != NULL )
NetApiBufferFree( lpWkStaInfo100 );
//下面根据版本信息判断操作系统名称
switch(os.dwMajorVersion) //判断主版本号
case 4:
switch(os.dwMinorVersion) //判断次版本号
case 0:
if(os.dwPlatformId==VER_PLATFORM_WIN32_NT)
strOsVerName=_T("Microsoft Windows NT 4.0"); //1996年7月发布
else if(os.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS)
strOsVerName=_T("Microsoft Windows 95");
break;
case 10:
strOsVerName=_T("Microsoft Windows 98");
break;
case 90:
strOsVerName=_T("Microsoft Windows Me");
break;
break;
case 5:
switch(os.dwMinorVersion) //再比较dwMinorVersion的值
case 0:
strOsVerName=_T("Microsoft Windows 2000"); //1999年12月发布
break;
case 1:
strOsVerName=_T("Microsoft Windows XP"); //2001年8月发布
break;
case 2:
if(os.wProductType==VER_NT_WORKSTATION &&
info.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)
strOsVerName=_T("Microsoft Windows XP Professional x64 Edition");
else if(GetSystemMetrics(SM_SERVERR2)==0)
strOsVerName=_T("Microsoft Windows Server 2003"); //2003年3月发布
else if(GetSystemMetrics(SM_SERVERR2)!=0)
strOsVerName=_T("Microsoft Windows Server 2003 R2");
break;
break;
case 6:
switch(os.dwMinorVersion)
case 0:
if(os.wProductType==VER_NT_WORKSTATION)/*
VER_NT_WORKSTATION是桌面系统 */
strOsVerName=_T("Microsoft Windows Vista");
else
strOsVerName=_T("Microsoft Windows Server 2008"); //服务器版本
break;
case 1:
if(os.wProductType==VER_NT_WORKSTATION)
strOsVerName=_T("Microsoft Windows 7");
else
strOsVerName=_T("Microsoft Windows Server 2008 R2");
break;
case 2:
if(os.wProductType==VER_NT_WORKSTATION)
strOsVerName=_T("Microsoft Windows 8");
else
strOsVerName=_T("Microsoft Windows Server 2012");
break;
case 3:
if(os.wProductType==VER_NT_WORKSTATION)
strOsVerName=_T("Microsoft Windows 8.1");
else
strOsVerName=_T("Microsoft Windows Server 2012 R2");
break;
break;
case 10:
switch(os.dwMinorVersion)
case 0:
strOsVerName = _T("Microsoft Windows 10");
break;
break;
default:
strOsVerName=_T("");
return strOsVerName;
以上是关于VC++获取Widnows操作系统版本(附源码)的主要内容,如果未能解决你的问题,请参考以下文章