问题一: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. Win10 安装 Python3 (上)

    Python3 For Windows 10 installer 参考 The full installer 安装 随后可以看到,installer 在用户环境变量PATH中,添加了三项: 卸载 使用 ...

  2. js--手动实现一个常见的短信验证码输入框

    前言 本文记录一下自己手动实现的一个前端常见的短信验证码输入组件,从需求到实现逐步优化的过程. 正文 1.需求分析 首先看一下效果图. 首先页面加载的时候,输入框获取焦点,当用户输入一个数字后,焦点自 ...

  3. GO学习-(21) Go语言基础之Go性能调优

    Go性能调优 在计算机性能调试领域里,profiling 是指对应用程序的画像,画像就是应用程序使用 CPU 和内存的情况. Go语言是一个对性能特别看重的语言,因此语言中自带了 profiling ...

  4. Go语言基础包之net/http

    Go语言基础包之net/http Go语言内置的net/http包十分的优秀,提供了HTTP客户端和服务端的实现. net/http介绍 Go语言内置的net/http包提供了HTTP客户端和服务端的 ...

  5. [NOIP2010 提高组] 机器翻译

    问题描述 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换.对于每个英文单词,软件会先在内存中查 ...

  6. 解决:django.core.exceptions.ImproperlyConfigured: Requested setting INSTALLED_APPS, but settings are not 的方法

    错误类型: 该错误是在在创建Django工程时出现遇到的错误 完整报错信息:(博文标题输入长度有限制) django.core.exceptions.ImproperlyConfigured: Req ...

  7. JUC 并发编程--07 阻塞队列版本的 生产者消费者(不使用synchronized和 lock),也有一些疑惑,最终解惑

    直接上代码: 前提是你已经 熟悉了原子类,volatile,和阻塞队列 public class JucPCdemo03 { /** * 阻塞队列的应用: 这里实现的生产者消费者,生产一个消费一个 * ...

  8. Django(62)自定义认证类

    前言 如果我们不用使用drf那套认证规则,我们想自定义认证类,那么我们首先要知道,drf本身是如何定义认证规则的,也就是要查看它的源码是如何写的 源码分析 源码的入口在APIView.py文件下的di ...

  9. P5960 【模板】差分约束算法

    题目描述 给出一组包含 $m$ 个不等式,有 $n$ 个未知数的形如: 的不等式组,求任意一组满足这个不等式组的解. 输入格式 第一行为两个正整数 $n,m$,代表未知数的数量和不等式的数量. 接下来 ...

  10. 性能分析之CPU分析-从CPU调用高到具体代码行(C/C++)

    今天在培训的过程中,也提到了分析要具体到代码的事情,如果思路方向是正确的,对java应用和C/C++应用来说,也是几个命令就可以跳到代码行了.前提是要能看得懂堆栈信息.所以一直以来我在讲课的过程中都有 ...