问题一: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. [论文阅读笔记] Unsupervised Attributed Network Embedding via Cross Fusion

    [论文阅读笔记] Unsupervised Attributed Network Embedding via Cross Fusion 本文结构 解决问题 主要贡献 算法原理 实验结果 参考文献 (1 ...

  2. python基础知识笔记(一)

    一.变量 可以是字母.数字(不能作为开头).下划线. 自定义的常量名一般全部大写. na = "liu" na2 = na print("my na is ", ...

  3. 深度学习与TensorFlow

    深度学习与TensorFlow DNN(深度神经网络算法)现在是AI社区的流行词.最近,DNN 在许多数据科学竞赛/Kaggle 竞赛中获得了多次冠军. 自从 1962 年 Rosenblat 提出感 ...

  4. CUDA统一内存分析

    CUDA统一内存分析 PascalMIG 如 NVIDIA Titan X 和 NVIDIA Tesla P100 是第一个包含页 GPUs 定额引擎的 GPUs ,它是统一内存页错误处理和 MIG ...

  5. Django(53)二次封装Response

    前言 有时候我们使用drf的Response,会发现默认返回的格式不太友好,每次我们都需要写入以下的格式 return Response({ "status": 0, " ...

  6. 20 岁发表 SCI 的学霸,梦想用算法改变世界

    2021 年 2 月,"新内容 新交互" 全球视频云创新挑战赛启幕.本次大赛由英特尔联合阿里云主办,与优酷战略技术合作,天池平台和阿里云视频云团队共同承办.大赛自开赛以来,吸引了全 ...

  7. 【NX二次开发】多种变换

    变换的种类: uf5942 矩阵乘积变换 uf5943 平移变换 uf5944 缩放变换 uf5945 旋转变换 uf5946 镜像变换 最后使用 uf5947 实现uf5942-uf5946的变换. ...

  8. Java知识,面试总会问到虚拟机,虚拟机类加载机制你懂吗?

    虚拟机把描述类的数据从Class文件文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 与那些在编译时需要进行连接工作的语言不同 ...

  9. Centos8.3、proxysql2.0读写分离实战记录

    接着主从复制继续往下讲,这个项目中我是使用proxysql做读写分离的中间件,之前是使用mycat.老实说mycat属于比较重量级的中间件,1.0还好到了2.0配置变得很复杂而且文档不是很齐全,我看着 ...

  10. gRPC入门—golang实现

    1.RPC 1.1 什么是RPC RPC(Remote Procedure Call),即远程过程调用,过程就是方法,简单来说,它就是一种能够像调用本地方法一样调用远程计算机进程中的方法的技术,在这种 ...