检查是否Windows 10

C++ Check if Windows 10

本文关键字:Windows 是否 检查      更新时间:2023-10-16

我正在制作一个针对特定操作系统的应用程序,但我似乎无法缩小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, wMajorVersionwMinorVersionwServicePackMajor分别为1000

这个函数的文档在这里。

第二次编辑:这是官方的:IsWindowsVersionOrGreater()GetVersionEx()从8.1起被打破。请始终使用IsWindowsXXXOrGreater(),其中XXX可以是XPXPSP1XPSP2XPSP3VistaVistaSP1VistaSP277SP188Point110Server

我的经验如下:

.
.
.
#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。