问题一:Windows SDK 8.1版本中的VersionHelper.h文件当中没有IsWindows10ORGreater,所以当你用IsWindows8Point1ORGreater判断出版本信息是Windows8.1以上的版本后,你就无法区分它到底是Win8.1还是Win10.

问题二:使用GetVersionEx这个API配合结构体OSVERSIONINFOEX这个方法获取版本信息,那么Win8以上的系统不论是Win8.1还是Win10都会被判定为主版本号为6,次版本号为2(即Win8的版本号)。

那么如何区分Win8.1和Win10?

使用如下未文档化API:

RtlGetNtVersionNumbers

 1 string GetNtVersionNumbers()
2 {
3 HMODULE hModNtdll = NULL;
4 DWORD dwMajorVer, dwMinorVer, dwBuildNumber;
5 OSVERSIONINFOEX lpVersionInformation;
6
7 BOOL set = GetVersionExW((OSVERSIONINFO *)&lpVersionInformation);
8
9 if ((lpVersionInformation.dwMajorVersion >= 6) && (lpVersionInformation.dwMinorVersion >= 2))
10 {
11 if (hModNtdll = ::LoadLibraryW(L"ntdll.dll"))
12 {
13 typedef void (WINAPI *pfRTLGETNTVERSIONNUMBERS)(DWORD*, DWORD*, DWORD*);
14 pfRTLGETNTVERSIONNUMBERS pfRtlGetNtVersionNumbers;
15 pfRtlGetNtVersionNumbers = (pfRTLGETNTVERSIONNUMBERS)::GetProcAddress(hModNtdll, "RtlGetNtVersionNumbers");
16 if (pfRtlGetNtVersionNumbers)
17 {
18 pfRtlGetNtVersionNumbers(&dwMajorVer, &dwMinorVer, &dwBuildNumber);
19 dwBuildNumber &= 0x0ffff;
20 }
21 ::FreeLibrary(hModNtdll);
22 hModNtdll = NULL;
23 }
24 }
25 string version = to_string(dwMajorVer) + "." + to_string(dwMinorVer) + "." + to_string(dwBuildNumber);
26 return version;
27 }

获取计算机操作系统信息基本可以依靠一下几个函数来完成

CString strOperatingSystem(OSVERSIONINFOEX str,BOOL tes)
{
// 系统信息
CString pszOS,gszOS;
if(tes)
pszOS = _T("Windows");
else
pszOS = _T("Win"); switch (str.dwPlatformId)
{
case VER_PLATFORM_WIN32_NT:
if ( str.dwMajorVersion <= 4 )
pszOS += _T("NT");
else if ( str.dwMajorVersion == 5 )
{
if( str.dwMinorVersion == 0 )
pszOS += _T("2000");
else if( str.dwMinorVersion == 1 )
pszOS += _T("XP");
else if( str.dwMinorVersion == 2 )
{
if(str.wProductType==VER_NT_WORKSTATION )
pszOS += _T("XP_x64");
else
pszOS += _T("2003");
}
}
else if ( str.dwMajorVersion == 6 )
{
if( str.dwMinorVersion == 0 )
{
if(str.wProductType == VER_NT_WORKSTATION)
pszOS += _T("Vista");
else
pszOS += _T("2008");
}
else if( str.dwMinorVersion == 1 )
{
if(str.wProductType == VER_NT_WORKSTATION)
pszOS += _T("7");
else
pszOS += _T("2008R2");
}
else if( str.dwMinorVersion == 2 )
{
if(str.wProductType == VER_NT_WORKSTATION)
pszOS += _T("8");
else
pszOS += _T("2012");
}
else if( str.dwMinorVersion == 3 )
{
if(str.wProductType == VER_NT_WORKSTATION)
pszOS += _T("8.1");
else
pszOS += _T("2012R2");
}
else
pszOS += _T("Null");
}
else if ( str.dwMajorVersion == 10 )
{
if( str.dwMinorVersion == 0 )
{
if(str.wProductType == VER_NT_WORKSTATION)
pszOS += _T("10");
else
pszOS += _T("2016");
}
}
}
if(lstrlen(pszOS))
gszOS.Format("%s SP%d",pszOS,str.wServicePackMajor);
else
gszOS = _T("未知操作系统"); return gszOS;
} // 读取系统位数
DWORD IsWow64()
{
DWORD bIsWow = 32;
BOOL bIsWow64 = FALSE;
FARPROC fnIsWow64Process = GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "IsWow64Process"); if(fnIsWow64Process)
((BOOL (WINAPI *)(HANDLE, PBOOL))fnIsWow64Process)(GetCurrentProcess(), &bIsWow64); if(bIsWow64)
bIsWow = 64;
else
bIsWow = 32; return bIsWow;
} BOOL GetNtVersionNumbers(DWORD&dwMajorVer, DWORD& dwMinorVer,DWORD& dwBuildNumber)
{
BOOL bRet= FALSE;
HMODULE hModNtdll= NULL;
if (hModNtdll= ::LoadLibraryW(L"ntdll.dll"))
{
typedef void (WINAPI *pfRTLGETNTVERSIONNUMBERS)(DWORD*,DWORD*, DWORD*);
pfRTLGETNTVERSIONNUMBERS pfRtlGetNtVersionNumbers;
pfRtlGetNtVersionNumbers = (pfRTLGETNTVERSIONNUMBERS)::GetProcAddress(hModNtdll, "RtlGetNtVersionNumbers");
if (pfRtlGetNtVersionNumbers)
{
pfRtlGetNtVersionNumbers(&dwMajorVer, &dwMinorVer,&dwBuildNumber);
dwBuildNumber&= 0x0ffff;
bRet = TRUE;
}
::FreeLibrary(hModNtdll);
hModNtdll = NULL;
} return bRet;
} // 获取系统版本号
BOOL g_GetVersionEx(OSVERSIONINFOEX &lpVersionInformation)
{
ZeroMemory(&lpVersionInformation, sizeof(OSVERSIONINFOEX));
lpVersionInformation.dwOSVersionInfoSize=sizeof(OSVERSIONINFOEX);
BOOL set = GetVersionExA((OSVERSIONINFO *)&lpVersionInformation); if((lpVersionInformation.dwMajorVersion >= 6)&&(lpVersionInformation.dwMinorVersion >= 2))
{
DWORD dwMajorVer,dwMinorVer,dwBuildNumber;
GetNtVersionNumbers(dwMajorVer,dwMinorVer,dwBuildNumber);
lpVersionInformation.dwMajorVersion = dwMajorVer;
lpVersionInformation.dwMinorVersion = dwMinorVer;
} return set;
}

  void main()
  {
  // TODO: Add your control notification handler code here

  OSVERSIONINFOEX Log_OsVerInfoEx; // 系统版本信息

  g_GetVersionEx(Log_OsVerInfoEx);

  CString VerInfo;
  VerInfo.Format("%d.%d %s[%d位]",Log_OsVerInfoEx.dwMajorVersion,Log_OsVerInfoEx.dwMinorVersion,strOperatingSystem(Log_OsVerInfoEx,TRUE),IsWow64());

  SetDlgItemText(IDC_VERLNFOEX,VerInfo);

  }

 

获取操作系统OS等相关信息的更多相关文章

  1. AD命令获取计算机、用户相关信息

    1. 获取AD用户相关信息(用户名.创建日期.最后修改密码日期.最后登录日期) Get AD users, Name/Created Date/Last change passwd Date/Last ...

  2. stat(),lstat(),fstat() 获取文件/目录的相关信息

    stat 的使用 Linux有个命令,ls -l,效果如下: 这个命令能显示文件的类型.操作权限.硬链接数量.属主.所属组.大小.修改时间.文件名.它是怎么获得这些信息的呢,请看下面的讲解. stat ...

  3. 编程实战——电影管理器之利用MediaInfo获取高清视频文件的相关信息

    随着高速(20M)宽带.HTPC.大容量硬盘(3T)的普及,下载高清片并利用大屏幕观看也成为普通的事情. 随着下载影片的增多,管理就有了问题,有时在茫茫文件夹下找寻一个影片也是一件费时费力的事. 于是 ...

  4. java 利用ManagementFactory获取jvm,os的一些信息--转

    原文地址:http://blog.csdn.net/dream_broken/article/details/49759043 想了解下某个Java项目的运行时jvm的情况,可以使用一些监控工具,比如 ...

  5. android 获取 imei号码 及相关信息

    android 获取 imei号码 参考:http://www.cnblogs.com/luxiaofeng54/archive/2011/03/01/1968063.html 核心代码: Imei ...

  6. asp.net中获取本机的相关信息!(CPU、内存、硬盘序列号等)

    // 注意:首先要在项目bin目录中添加引用 System.Management using System;using System.Collections.Generic;using System. ...

  7. iOS获取运营商的相关信息

    1.导入:CoreTelephony.framework 2.添加头文件 #import <CoreTelephony/CTTelephonyNetworkInfo.h> #import ...

  8. 【Android M】获取屏幕锁定的相关信息:“无”,“滑动”,“PIN码”,"图案","密码"

    ENV: Android M 6.0.1 import android.os.UserHandle;         import com.android.internal.widget.LockPa ...

  9. 获取APP和设备相关信息

    APP NAME: [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleDisplayName"] APP ...

随机推荐

  1. 2021 docker安装宝塔面板

    拉取CentOS镜像 docker pull centos 创建 docker 容器 启动镜像,映射主机与容器内8888(宝塔面板).888(PHPMYADMIN)端口 -v 挂在目录 为了能够保存( ...

  2. 解决了一个java服务线程退出的问题

    问题背景 ​ 早上才上班,测试就提了一个问题:"昨天所有批量任务都没有跑".我看了一下任务监控页面,任务是有生成的,但却一直在等待调度状态.初步怀疑是我们的调度服务问题,于是上去查 ...

  3. GO学习-(23) Go语言操作MySQL + 强大的sqlx

    Go语言操作MySQL MySQL是业界常用的关系型数据库,本文介绍了Go语言如何操作MySQL数据库. Go操作MySQL 连接 Go语言中的database/sql包提供了保证SQL或类SQL数据 ...

  4. FinFET与2nm晶圆工艺壁垒

    FinFET与2nm晶圆工艺壁垒 谈到半导体工艺尺寸的时候,通常对于下面的一串数字耳熟能详:3um.2um.1.5um.1um.0.8um.0.5um.0.35um.0.25um.0.18um.0.1 ...

  5. Torchvision模型微调

    Torchvision模型微调 本文将深入探讨如何对 torchvision 模型进行微调和特征提取,所有这些模型都已经预先在1000类的magenet数据集上训练完成.将深入介绍如何使用几个现代的C ...

  6. 常用深度学习框——Caffe/ TensorFlow / Keras/ PyTorch/MXNet

    常用深度学习框--Caffe/ TensorFlow / Keras/ PyTorch/MXNet 一.概述 近几年来,深度学习的研究和应用的热潮持续高涨,各种开源深度学习框架层出不穷,包括Tenso ...

  7. 高效Tensor张量生成

    高效Tensor张量生成 Efficient Tensor Creation 从C++中的Excel数据中创建Tensor张量的方法有很多种,在简单性和性能之间都有不同的折衷.本文讨论了一些方法及其权 ...

  8. Excel创建序列号1000个

    一.输入1,并且选择 二.开始-填充 三.选择序列 四.选择列-等差序列-步张值输入1 终止值输入1000 点击确定 五.查看结果,选中这一列 六.快捷键 Ctrl+下键 则跳转到最下方,上键则是最上 ...

  9. Git_远程仓库fork操作

    fork操作:当选择 fork,相当于自己有了一份原项目的拷贝,当然这个拷贝只是针对当时的项目文件,如果后续原项目文件发生改变,你必须通过其他的方式去同步. 使用场景:一般来说,不需要使用 fork ...

  10. Spring源码分析-从@ComponentScan注解配置包扫描路径到IoC容器中的BeanDefinition,经历了什么(一)?

    阅前提醒 全文较长,建议沉下心来慢慢阅读,最好是打开Idea,点开Spring源码,跟着下文一步一步阅读,更加便于理解.由于笔者水平优先,编写时间仓促,文中难免会出现一些错误或者不准确的地方,恳请各位 ...