目录
1、系统API函数GetVersionEx已经被废弃,不能再使用了
2、不同版本的操作系统是如何区分的
3、调用API接口NetWkstaGetInfo,获取系统的版本号
4、代码示例
5、判断系统是32位还是64位的
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.htmlC++软件分析工具从入门到精通案例集锦(专栏文章正在更新中...)https://blog.csdn.net/chenlycly/article/details/131405795 有时候我们需要获取操作系统版本,比如win7、win8、win8.1、win10等,对不同版本的系统做特殊处理。有时我们还需要分辨当前系统是64位的,还是32位的。
以前我们一般使用系统API函数GetVersionEx去获取操作系统版本,但从Windows8.1开始,该API函数就被微软废弃了,这点可以看MSDN上对该API函数的说明:
对于Windows 8.1以上的操作系统,该函数就获取不到正确的版本号了!
操作系统有个主版本号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系统,需要考虑这两种情况。
既然老的接口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函数内部分配的!
判断是否是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;
}
有时我们还需要判断当前系统是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;
}
}