检查是否Windows 10
C++ Check if Windows 10
我正在制作一个针对特定操作系统的应用程序,但我似乎无法缩小Windows 10的范围,它出现在Windows 8上。我在windows 10 Pro上测试了一下,结果是Major: 6 Min:2。是否有其他方法可以更有效地检查windows 10 ?
编辑:找到一个正常工作的API RtlGetVersion()适用于所有操作系统的正确!
#include "windows.h"
#include <iostream>
using namespace std;
BOOL EqualsMajorVersion(DWORD majorVersion)
{
OSVERSIONINFOEX osVersionInfo;
::ZeroMemory(&osVersionInfo, sizeof(OSVERSIONINFOEX));
osVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
osVersionInfo.dwMajorVersion = majorVersion;
ULONGLONG maskCondition = ::VerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL);
return ::VerifyVersionInfo(&osVersionInfo, VER_MAJORVERSION, maskCondition);
}
BOOL EqualsMinorVersion(DWORD minorVersion)
{
OSVERSIONINFOEX osVersionInfo;
::ZeroMemory(&osVersionInfo, sizeof(OSVERSIONINFOEX));
osVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
osVersionInfo.dwMinorVersion = minorVersion;
ULONGLONG maskCondition = ::VerSetConditionMask(0, VER_MINORVERSION, VER_EQUAL);
return ::VerifyVersionInfo(&osVersionInfo, VER_MINORVERSION, maskCondition);
}
int main()
{
if (EqualsMajorVersion(7) && EqualsMinorVersion(1))
printf("Maj:7 Min:1");
else if (EqualsMajorVersion(7) && EqualsMinorVersion(0))
printf("Maj:7 Min:0");
else if (EqualsMajorVersion(6) && EqualsMinorVersion(7))
printf("Maj:6 Min:7");
else if (EqualsMajorVersion(6) && EqualsMinorVersion(6))
printf("Maj:6 Min:6");
else if (EqualsMajorVersion(6) && EqualsMinorVersion(5))
printf("Maj:6 Min:5");
else if (EqualsMajorVersion(6) && EqualsMinorVersion(4))
printf("Maj:6 Min:4");
else if (EqualsMajorVersion(6) && EqualsMinorVersion(3))
printf("Maj:6 Min:3");
else if (EqualsMajorVersion(6) && EqualsMinorVersion(2))
printf("Maj:6 Min:2");
else if (EqualsMajorVersion(6) && EqualsMinorVersion(1))
printf("Maj:6 Min:1");
else if (EqualsMajorVersion(6) && EqualsMinorVersion(0))
printf("Maj:6 Min:0");
else if (EqualsMajorVersion(5) && EqualsMinorVersion(2))
printf("Maj:5 Min:2");
else if (EqualsMajorVersion(5) && EqualsMinorVersion(1))
printf("Maj:5 Min:1");
else
printf("OS not on list...");
getchar();
}
这很讽刺,但是…
BOOL WINAPI IsWindows10OrGreater(void);
文档。
编辑:来自雷德蒙德的天才们似乎在思考原型方面有问题,或者换句话说,OP得到了一个未定义的符号错误,如评论中所述。还有这个函数:
BOOL WINAPI IsWindowsVersionOrGreater(
WORD wMajorVersion,
WORD wMinorVersion,
WORD wServicePackMajor
);
对于Windows 10, wMajorVersion
、wMinorVersion
和wServicePackMajor
分别为10
、0
和0
。
这个函数的文档在这里。
第二次编辑:这是官方的:IsWindowsVersionOrGreater()
和GetVersionEx()
从8.1起被打破。请始终使用IsWindowsXXXOrGreater()
,其中XXX
可以是XP
、XPSP1
、XPSP2
、XPSP3
、Vista
、VistaSP1
、VistaSP2
、7
、7SP1
、8
、8Point1
、10
或Server
。
我的经验如下:
.
.
.
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
.
.
.
typedef void (WINAPI * RtlGetVersion_FUNC) (OSVERSIONINFOEXW *);
BOOL GetVersion(OSVERSIONINFOEX * os) {
HMODULE hMod;
RtlGetVersion_FUNC func;
#ifdef UNICODE
OSVERSIONINFOEXW * osw = os;
#else
OSVERSIONINFOEXW o;
OSVERSIONINFOEXW * osw = &o;
#endif
hMod = LoadLibrary(TEXT("ntdll.dll"));
if (hMod) {
func = (RtlGetVersion_FUNC)GetProcAddress(hMod, "RtlGetVersion");
if (func == 0) {
FreeLibrary(hMod);
return FALSE;
}
ZeroMemory(osw, sizeof (*osw));
osw->dwOSVersionInfoSize = sizeof (*osw);
func(osw);
#ifndef UNICODE
os->dwBuildNumber = osw->dwBuildNumber;
os->dwMajorVersion = osw->dwMajorVersion;
os->dwMinorVersion = osw->dwMinorVersion;
os->dwPlatformId = osw->dwPlatformId;
os->dwOSVersionInfoSize = sizeof (*os);
DWORD sz = sizeof (os->szCSDVersion);
WCHAR * src = osw->szCSDVersion;
unsigned char * dtc = (unsigned char *)os->szCSDVersion;
while (*src)
* Dtc++ = (unsigned char)* src++;
*Dtc = ' 0';
#endif
} else
return FALSE;
FreeLibrary(hMod);
return TRUE;
}
.
.
.
//check win10
void mymethod() {
OSVERSIONINFOEX os;
if (GetVersion(&os) == TRUE && os.dwMajorVersion == 10)
{
isWin10 = TRUE;
}
}
Ref。:(http://yamatyuu.net/computer/program/vc2013/rtlgetversion/index.html)
更新:检查win7, win8.1和win10。现在一切都决定了。所以代码:
#include <windows.h>
#include <VersionHelpers.h>
#include <string>
std::string getWinVerion() {
OSVERSIONINFO info;
ZeroMemory(&info, sizeof(OSVERSIONINFO));
info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&info);
std::string version = std::to_string(info.dwMajorVersion);
version.append(".").append(std::to_string(info.dwMinorVersion));
if (IsWindows7SP1OrGreater()) {
if (version == "6.1")
return "6.1";
}
if (IsWindows8Point1OrGreater())
return "6.3";
else
return "10.0";
}
这是真的,检测这是否是Windows 10的唯一方法是使用
BOOL WINAPI IsWindows10OrGreater(void);
虽然您需要使用Visual Studio 2015的最新SDK。注意
BOOL WINAPI IsWindowsVersionOrGreater(
WORD wMajorVersion,
WORD wMinorVersion,
WORD wServicePackMajor);
不能在Windows 10上工作,同样的:
BOOL WINAPI GetVersionEx( _Inout_ LPOSVERSIONINFO lpVersionInfo);
有时返回6.2或6.3。
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 是否可以用C++/WinRT将windows 10.0.14393作为目标
- 我是否需要包含隐式使用/与 WindowsAPI 通信"Windows.h"?
- 是否有 Windows 用户空间函数来枚举连接的网络共享?
- Windows 链接器是否使用 LoadLibrary 解析 DLL 中未定义的符号?
- 是否有可能构建面向Linux和Windows的.Net Core C++ / CLI应用程序?
- Windows 是否可以调用静态库中的 WinMain 函数C++
- Windows 和 Android 应用程序是否需要 SSL?
- 如何在Windows上检查EXE是否具有/GS安全保护
- 假定 Windows 伪句柄的值是否安全/定义?
- 是否有一个Windows驱动程序函数可以执行Windows文件api SeFileAttributes的等效功能
- 如何检查 CNG Windows API 是否返回符合 FIPS 的算法实现
- 检查用户是否是 Windows 中本地计算机上的管理员C++
- 如何跟踪Windows 7是否在C ++中以编程方式进入睡眠或休眠状态,就像在Windows XP中所做的那样
- 有没有办法以编程方式接收Windows是否正在关闭或重新启动
- Windows是否支持从内存运行程序
- Windows是否允许同时写入文件
- CPP WINDOWS:是否有以微秒为单位的睡眠功能
- 如何检查Windows是否嵌入式或POS
- 如何在运行的C++/Qt应用程序中检测底层Windows是否为32或64位版本