获取windows 系统信息

方法有好多中,此处都是总结网络上的内容,前辈已经把window 10 系统之前的坑趟完
老方法:转载这里写链接内容

//读取操作系统的名称  
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)
需要仔细阅读微软说明这里写链接内容
出现这个问题的原因:简单讲就是兼容问题。可以通过修改manifest文件解决,也可以采用新的API来获取版本号。但是由于新的API在低版本操作系统没有,还要特别处理,我们干脆使用修改manifest文件的方法,提高程序自身的兼容性,从而得到正确的系统版本信息。

<?xml version="1.0" encoding="UTF-8"?>   
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">   
    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">   
        <application>   
            <!-- Windows 10 -->   
            <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>  
            <!-- Windows 8.1 -->  
            <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>  
            <!-- Windows Vista -->  
            <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>   
            <!-- Windows 7 -->  
            <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>  
            <!-- Windows 8 -->  
            <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>  
        </application>   
    </compatibility>  
</assembly>   

将以上内容保存为compatibility.xml,留着备用
实际项目中使用,配置目标那里选则所有配置,配置属性->清单工具->输入和输出-附加清单文件 填写compatibility.xml,并把这个文件拷贝到项目源代码目录。

如果以上方法不能满足你的需求请看这里写链接内容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值