C 检查是否是 Windows 10

新手上路,请多包涵

我正在为特定于操作系统的应用程序制作应用程序,但我似乎无法缩小 Windows 10 的范围,它以 Windows 8 的形式出现。我在 Window 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();
}

原文由 user3732111 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 393
1 个回答

这很讽刺,但是…

 BOOL WINAPI IsWindows10OrGreater(void);

文档 在这里

编辑:来自雷德蒙德的天才们似乎在思考原型时遇到了问题,或者换句话说,OP 得到了一个未定义的符号错误,如评论中所述。还有这个功能:

 BOOL WINAPI IsWindowsVersionOrGreater(
    WORD wMajorVersion,
    WORD wMinorVersion,
    WORD wServicePackMajor
);

And, for Windows 10, wMajorVersion , wMinorVersion , and wServicePackMajor appear to be, respectively, 10 , 00

该功能的文档在 这里

第二次编辑:这是官方的: IsWindowsVersionOrGreater()GetVersionEx() 从 8.1 开始被破坏。 Use IsWindowsXXXOrGreater() always instead, where XXX can be XP , XPSP1 , XPSP2 , XPSP3 , Vista , VistaSP1 , VistaSP2 , 7 , 7SP1 , 8 , 8Point1 , 10 , 或 Server

原文由 3442 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题