VC++判断Windows系统是Win7、Win8,还是Win10系统(附源码)
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
目录
1、系统API函数GetVersionEx已经被废弃不能再使用了
3、调用API接口NetWkstaGetInfo获取系统的版本号
VC++常用功能开发汇总专栏文章列表欢迎订阅持续更新...https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程专栏文章列表欢迎订阅持续更新...https://blog.csdn.net/chenlycly/article/details/125529931C/C++基础与进阶https://blog.csdn.net/chenlycly/category_11931267.html 有时候我们需要获取操作系统版本比如win7、win8、win8.1、win10等对不同版本的系统做特殊处理。有时我们还需要分辨当前系统是64位的还是32位的。
1、系统API函数GetVersionEx已经被废弃不能再使用了
以前我们一般使用系统API函数GetVersionEx去获取操作系统版本但从Windows8.1开始该API函数就被微软废弃了这点可以看MSDN上对该API函数的说明
对于Windows 8.1以上的操作系统该函数就获取不到正确的版本号了
2、不同版本的操作系统是如何区分的
操作系统有个主版本号MajorVersion还有个子版本号MinorVersion主要是将这个版本号组合起来判断系统版本的如下
/*****************************************************************************
Operating System Version PlatformID
Windows 10 10.0 VER_PLATFORM_WIN32_NT
Windows 8.1 6.3 VER_PLATFORM_WIN32_NT
Windows 8 6.2 VER_PLATFORM_WIN32_NT
Windows 7 6.1 VER_PLATFORM_WIN32_NT
Windows Vista 6.0 VER_PLATFORM_WIN32_NT
Windows XP 64-Bit Edition 5.2 VER_PLATFORM_WIN32_NT
Windows XP 5.1 VER_PLATFORM_WIN32_NT
******************************************************************************/
所以要判断操作系统版本通过主版本号MajorVersion和子版本号MinorVersion就能确定了。
这个地方需要注意一下Win8系统有两个版本一个是Windows 8对应6.2一个是Windows 8.1对应6.3所以要判断系统是否是Win8系统需要考虑这两种情况。
3、调用API接口NetWkstaGetInfo获取系统的版本号
既然老的接口GetVersionEx不能再使用了那应该使用哪个接口呢经研究发现我们可以调用API接口NetWkstaGetInfo。可以查看MSDN上对该API接口的说明
在调用接口前首先要包含lmwksta.h或Lm.h头文件然后再引入Netapi32.lib库
调用接口的示例代码如下判断是否是Win8以上的系统
BOOL IsOsWin8OrAbove()
{
BOOL bOSWin8OrAbove = FALSE;
// 下面要调用NetWkstaGetInfo
DWORD dwLevel = 100;
LPWKSTA_INFO_100 lpWkStaInfo100 = NULL;
NET_API_STATUS statusRet = NetWkstaGetInfo( NULL, dwLevel, (LPBYTE*)&lpWkStaInfo100 );
if ( statusRet == NERR_Success )
{
// win8及以上版本
if ( (lpWkStaInfo100->wki100_ver_major == 6 && lpWkStaInfo100->wki100_ver_minor >= 2) ||
lpWkStaInfo100->wki100_ver_major > 6 )
{
bOSWin8OrAbove = TRUE;
}
}
// Free the allocated memory
if ( lpWkStaInfo100 != NULL )
{
NetApiBufferFree( lpWkStaInfo100 );
}
return bOSWin8OrAbove;
}
注意调用完NetWkstaGetInfo接口后需要调用NetApiBufferFree将内存释放掉因为调用NetWkstaGetInfo时传入的是LPWKSTA_INFO_100结构体指针对应的内存是NetWkstaGetInfo函数内部分配的
4、代码示例
判断是否是Win7以上系统
BOOL IsOsWin7OrAbove()
{
BOOL bOSWin7OrAbove = FALSE;
// 下面要调用NetWkstaGetInfo
DWORD dwLevel = 100;
LPWKSTA_INFO_100 lpWkStaInfo100 = NULL;
NET_API_STATUS statusRet = NetWkstaGetInfo( NULL, dwLevel, (LPBYTE*)&lpWkStaInfo100 );
if ( statusRet == NERR_Success )
{
// win8及以上版本
if ( (lpWkStaInfo100->wki100_ver_major == 6 && lpWkStaInfo100->wki100_ver_minor >= 1) ||
lpWkStaInfo100->wki100_ver_major > 6 )
{
bOSWin7OrAbove = TRUE;
}
}
// Free the allocated memory
if ( lpWkStaInfo100 != NULL )
{
NetApiBufferFree( lpWkStaInfo100 );
}
return bOSWin7OrAbove;
}
判断是否是Win10及以上系统
BOOL IsOsWin10OrAbove()
{
BOOL bOSWin10OrAbove = FALSE;
// 下面要调用NetWkstaGetInfo
DWORD dwLevel = 100;
LPWKSTA_INFO_100 lpWkStaInfo100 = NULL;
NET_API_STATUS statusRet = NetWkstaGetInfo( NULL, dwLevel, (LPBYTE*)&lpWkStaInfo100 );
if ( statusRet == NERR_Success )
{
// win8及以上版本
if ( (lpWkStaInfo100->wki100_ver_major == 6 && lpWkStaInfo100->wki100_ver_minor >= 1) ||
lpWkStaInfo100->wki100_ver_major > 6 )
{
bOSWin10OrAbove = TRUE;
}
}
// Free the allocated memory
if ( lpWkStaInfo100 != NULL )
{
NetApiBufferFree( lpWkStaInfo100 );
}
return bOSWin10OrAbove;
}
5、判断系统是32位还是64位的
有时我们还需要判断当前系统是32的还是64位的可以调用GetNativeSystemInfo接口去判断相关代码如下
// 是否是64位操作系统
BOOL IsOS64()
{
SYSTEM_INFO si = { 0 };
GetNativeSystemInfo( &si );
if ( si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64
|| si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64 )
{
return TRUE;
}
else
{
return FALSE;
}
}