获取Windows系统版本号

前言

由于前段时间比较忙,一直没有来跟大家分享交流技术,实在是抱歉,往后我会不定时跟大家分享一些C++技术。

废话

有些东西看似简单,但坑多着呢,所以大家还是要多亲自尝试,不要眼高手低。

核心代码

//读取操作系统的名称
string GetSystemName()
{
	SYSTEM_INFO info;        //用SYSTEM_INFO结构判断64位AMD处理器 
	GetSystemInfo(&info);    //调用GetSystemInfo函数填充结构 
	OSVERSIONINFOEX os; 
	os.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);   

	string osname = "unknown OperatingSystem.";

	if(GetVersionEx((OSVERSIONINFO *)&os))
	{ 
		//下面根据版本信息判断操作系统名称 
		switch(os.dwMajorVersion)//判断主版本号
		{
		case 4:
			switch(os.dwMinorVersion)//判断次版本号 
			{ 
			case 0:
				if(os.dwPlatformId==VER_PLATFORM_WIN32_NT)
					osname = "Microsoft Windows NT 4.0"; //1996年7月发布 
				else if(os.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS)
					osname = "Microsoft Windows 95";
				break;
			case 10:
				osname = "Microsoft Windows 98";
				break;
			case 90:
				osname = "Microsoft Windows Me";
				break;
			}
			break;

		case 5:
			switch(os.dwMinorVersion)	//再比较dwMinorVersion的值
			{ 
			case 0:
				osname = "Microsoft Windows 2000";//1999年12月发布
				break;

			case 1:
				osname = "Microsoft Windows XP";//2001年8月发布
				break;

			case 2:
				if(os.wProductType==VER_NT_WORKSTATION 
					&& info.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)
				{
					osname = "Microsoft Windows XP Professional x64 Edition";
				}
				else if(GetSystemMetrics(SM_SERVERR2)==0)
					osname = "Microsoft Windows Server 2003";//2003年3月发布 
				else if(GetSystemMetrics(SM_SERVERR2)!=0)
					osname = "Microsoft Windows Server 2003 R2";
				break;
			}
			break;

		case 6:
			switch(os.dwMinorVersion)
			{
			case 0:
				if(os.wProductType == VER_NT_WORKSTATION)
					osname = "Microsoft Windows Vista";
				else
					osname = "Microsoft Windows Server 2008";//服务器版本 
				break;
			case 1:
				if(os.wProductType == VER_NT_WORKSTATION)
					osname = "Microsoft Windows 7";
				else
					osname = "Microsoft Windows Server 2008 R2";
				break;
			case 2:
				if(os.wProductType == VER_NT_WORKSTATION)
					osname = "Microsoft Windows 8";
				else
					osname = "Microsoft Windows Server 2012";
				break;
			case 3:
				if(os.wProductType == VER_NT_WORKSTATION)
					osname = "Microsoft Windows 8.1";
				else
					osname = "Microsoft Windows Server 2012 R2";
				break;
			}
			break;

		case 10:
			switch(os.dwMinorVersion)
			{
			case 0:
				if(os.wProductType == VER_NT_WORKSTATION)
					osname = "Microsoft Windows 10";
				else
					osname = "Microsoft Windows Server 2016 Technical Preview";//服务器版本 
				break;
			}
			break;
		}
	}//if(GetVersionEx((OSVERSIONINFO *)&os))
	//https://msdn.microsoft.com/en-us/library/ms724832.aspx
	return osname;
} 
注意事项

现在系统升级很快,这对软件开发人员来说是个打击,测试起来太麻烦,要考虑的兼容性问题也越来越多,坑也越来越多。。。
虽然核心代码就一个函数:GetVersionEx,但是Win8.1和Win10获取到的版本缺一直是6.2(Win8)
仔细阅读微软说明:https://msdn.microsoft.com/en-us/library/ms724832.aspx 细心的朋友可以从中找到答案
我用国语讲一下出现这个问题的原因:简单讲就是兼容问题。可以通过修改manifest文件解决,也可以采用新的API来获取版本号。
由于新的API在低版本操作系统没有,还要特别处理,我们干脆使用修改manifest文件的方法,提高程序自身的兼容性,从而得到正确的系统版本信息。


 
 
     
         
             
            
            
            
            
             
            
            
            
            
         
    
 
将以上内容保存为compatibility.xml,留着备用。
实战

问题和解决方法也介绍差不多了,下面演示一下如何正确使用。
新建一个基于对话框的MFC项目,然后添加如下图所示代码,执行结果如下
获取Windows系统版本号_第1张图片

很明显。是有问题的,本来win8.1系统,它说是win8的,下面说一下解决办法。
代码不变,只需要把项目属性设置一下就好了
配置目标那里选则所有配置,配置属性->清单工具->输入和输出-附加清单文件 填写compatibility.xml,并把这个文件拷贝到项目源代码目录。
具体设置如下图所示:

获取Windows系统版本号_第2张图片

设置保存后,重新生成一下,然后运行,结果如下:

获取Windows系统版本号_第3张图片

很明显,已经是win8.1了,将程序拷贝到Win10机器上,获取到的也正确。


获取更多机器信息,请移步这里:http://blog.csdn.net/sunflover454/article/details/51525686

可以获取操作系统版本,MAC地址,本地IP地址,以及判定是否为网吧。核心我已经封装成类了。

你可能感兴趣的:(C++/MFC,Win10获取系统版本号,Win8.1获取系统版本号,获取系统版本号)