VC++判断Windows系统是Win7、Win8,还是Win10系统(附源码)

这篇具有很好参考价值的文章主要介绍了VC++判断Windows系统是Win7、Win8,还是Win10系统(附源码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

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位的。

VC++判断Windows系统是Win7、Win8,还是Win10系统(附源码)

1、系统API函数GetVersionEx已经被废弃,不能再使用了

        以前我们一般使用系统API函数GetVersionEx去获取操作系统版本,但从Windows8.1开始,该API函数就被微软废弃了,这点可以看MSDN上对该API函数的说明:

VC++判断Windows系统是Win7、Win8,还是Win10系统(附源码)

对于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接口的说明:

VC++判断Windows系统是Win7、Win8,还是Win10系统(附源码)

在调用接口前,首先要包含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接口去判断,相关代码如下:文章来源地址https://www.toymoban.com/news/detail-435986.html

// 是否是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;
	}
}

到了这里,关于VC++判断Windows系统是Win7、Win8,还是Win10系统(附源码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Win7系统提示Windows Defender无法扫描选定的文件解决方法

           Win7 64位系统提示“Windows Defender无法扫描选定的文件”怎么办呢?使用Windows Defender扫描文件,结果弹出如下图窗口,该怎么解决呢,参考下文,一起来解决Win7系统提示“Windows Defender无法扫描选定的文件”的解决方法。   原因分析:      这是因为开启Defender扫描压

    2024年02月09日
    浏览(51)
  • 电脑重装win11系统好还是win10好

    随着Windows 11的发布,许多用户开始思考,是应该升级到Windows 11还是继续使用Windows 10?本文将为您比较Windows 11和Windows 10的优势与劣势,帮助您选择适合自己的操作系统。  工具/原料: 系统版本:windows11系统 品牌型号:戴尔灵越15 软件版本: 全新界面和用户体验 Windows 11带

    2024年02月09日
    浏览(59)
  • WIN7/WIN10/WIN11系统下触屏软键盘无法跟随跳出,桌面模式无法自动弹出(随动键盘)

    1、开启自动弹出软键盘的功能。 按组合键 “Win+I” 进入Windows设置,选择设备 输入,勾上 “不处于平板电脑模式且未连接键盘时显示触摸键盘” 2、WIN10/WIN11系统本身会集成HID(即交互触屏驱动),电容屏不用单独在加驱动,部分电阻屏也无需另装driver(触摸精准的情况下)

    2024年02月08日
    浏览(50)
  • Win7环境64win操作系统,安装microsoft office2010 时MSXML版本6.10.1129.0,无法安装的解决办法

    ** 第一步 :在百度搜索MSXML6.10.1129.0软件进行下载,大概就是5M左右的大小,下载后解压,选择 第二项进行安装。 第二步: 按照https://mip.win7zhijia.cn/jiaocheng/win7_41377.html进行修改注册表。 但是往往按照以上步骤修改完注册表后还是不能正常安装。 原因是修改注册表时出错,如

    2024年02月12日
    浏览(75)
  • 360随身wifi不支持win8.1系统该怎么办?

    win7中使用很方便,但是360随身wifi在最新的win8和win8.1系统中就无法使用。插在电脑上没有反应,如果你购买了360随身wifi,同时又安装了win8.1系统,就不行了。 金山毒霸 猎豹正式版 2013.0918 官方永久免费安装版 类型: 病毒防治 大小: 11.5MB 语言: 简体中文 时间: 2012-09-18 查

    2024年02月08日
    浏览(47)
  • win10开启了hyper-v,docker 启动还是报错 docker desktop windows hypervisor is not present

    在安装了docker windows版本后启动 docker报错docker desktop windows hypervisor is not present 勾选后重启,再次启动 启动后仍报这个错误,是Hyper-v没有设置成功 一.禁用hyper-v 管理员打开cmd窗口执行: 二.启用hyper-v 重启再次启动就可以了 关闭后重启电脑就可以了 Docker Desktop和VMware都试图独

    2024年04月17日
    浏览(60)
  • office365在win7上使用订阅+win7在线升级win10就用它(亲测有效)

    前言: 作为office365的重度使用用户,最近两天订阅到期,续订之后一直显示无法验证此订阅(仅查看),office365未经授权,大多数功能已停用,狂晕!!! 在微软官网上获知2020年1月14日起已不再提供office365对Windows7计算机的支持. 好吧,官方下载win10工具准备升级,下载地址

    2024年02月06日
    浏览(53)
  • Win10/Win7 离线安装 vs2019 详细步骤

    下载链接:https://visualstudio.microsoft.com/zh-hans/vs/ 点击右上角:免费 Visual Studio 说明:win7 安装 vs 时不建议安装最新版本,目前我装的是 vs2019 亲测可以使用!!!  正常 C++ 开发只需要下载:.NET桌面开发、使用 C++ 的桌面开发、使用 C++ 的移动开发、通用 windows 平台开发;即可

    2024年02月05日
    浏览(74)
  • win7、win10连接到win10共享打印机出现0x0000011b错误

    win10系统作为主机的打印机正常开启共享设置后,局域网其它打印机无法连接出现0x0000011b错误如图所所示   解决办法: 第一步:在共享打印机主机电脑上点运行(win+R键快捷打开),输入regedit打开注册表;  第二步:找到[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlPrint]目录:

    2024年02月12日
    浏览(105)
  • JDK 8下载-安装-卸载全教程(win7及win10)

    1.在百度输入 jdk 8,找到orale的地址(https://www.oracle.com/java/technologies/downloads/archive/) Java Archive | Oracle 下拉,找到下载其他版本的下载之处,本次要下载jdk 8,点击后进行下载,此处需注意一点,只有注册后才能下载,下载后会提示进行oracle的用户注册,使用微信、qq或者邮箱

    2024年02月04日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包