首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >获取Windows版本

获取Windows版本
EN

Stack Overflow用户
提问于 2015-12-12 01:27:31
回答 1查看 3.3K关注 0票数 2

如何准确地检测Visual 2012.3中本机(C/C++)项目上当前Windows操作系统的情况?

我已经在MS推荐下看过VersionHelperAPI了,但是这个解决方案只适用于VS2013

以前我们使用过GetVersionEx(),但是我想要一种更稳定、更有前途的解决方案。看起来,微软计划在未来不再支持这一点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-17 03:14:31

重要的是在清单文件中包含兼容性标志:

针对Windows的应用程序

以下是有关部分:

代码语言:javascript
运行
复制
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> 
    <application> 
        <!-- Windows 10 --> 
        <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
        <!-- Windows 8.1 -->
        <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
        <!-- Windows Vista -->
        <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/> 
        <!-- Windows 7 -->
        <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
        <!-- Windows 8 -->
        <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
    </application> 
</compatibility>

如果没有上面的标记,当运行在Windows10上时,GetVersionExVerifyVersionInfoW将看到Windows8

微软坚持认为你应该使用VerifyVersionInfoW而不是GetVersionEx

有些助手函数在早期版本中是不可用的。但在您的计算机上,您可以在以下目录中找到它们:

代码语言:javascript
运行
复制
"C:\Program Files (x86)\Windows Kits\8.1\Include\um\VersionHelpers.h"

下面是它们的特点(我稍微修改了它们,因为它们太长了,并且测试了Windows 10,您应该反复检查旧版本的Windows )。

代码语言:javascript
运行
复制
#define _WIN32_WINNT_NT4      0x0400
#define _WIN32_WINNT_WIN2K    0x0500
#define _WIN32_WINNT_WINXP    0x0501
#define _WIN32_WINNT_WS03     0x0502
#define _WIN32_WINNT_WIN6     0x0600
#define _WIN32_WINNT_VISTA    0x0600
#define _WIN32_WINNT_WS08     0x0600
#define _WIN32_WINNT_LONGHORN 0x0600
#define _WIN32_WINNT_WIN7     0x0601
#define _WIN32_WINNT_WIN8     0x0602
#define _WIN32_WINNT_WINBLUE  0x0603
#define _WIN32_WINNT_WIN10    0x0A00

BOOL IsWinVersionOrGreater(DWORD id, WORD wServicePackMajor)
{
    WORD wMajorVersion = HIBYTE(id);
    WORD wMinorVersion = LOBYTE(id);

    OSVERSIONINFOEXW osvi = { sizeof(osvi), 0, 0, 0, 0,{ 0 }, 0, 0 };
    DWORDLONG const dwlConditionMask =
        VerSetConditionMask(
            VerSetConditionMask(
                VerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL),
                VER_MINORVERSION, VER_GREATER_EQUAL),
            VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL);

    osvi.dwMajorVersion = wMajorVersion;
    osvi.dwMinorVersion = wMinorVersion;
    osvi.wServicePackMajor = wServicePackMajor;

    return VerifyVersionInfoW(&osvi, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR, dwlConditionMask) != FALSE;
}

BOOL IsWindowsXPOrGreater()      {  return IsWinVersionOrGreater(_WIN32_WINNT_WINXP, 0);}
BOOL IsWindowsXPSP1OrGreater()   {  return IsWinVersionOrGreater(_WIN32_WINNT_WINXP, 1);}
BOOL IsWindowsXPSP2OrGreater()   {  return IsWinVersionOrGreater(_WIN32_WINNT_WINXP, 2);}
BOOL IsWindowsXPSP3OrGreater()   {  return IsWinVersionOrGreater(_WIN32_WINNT_WINXP, 3);}
BOOL IsWindowsVistaOrGreater()   {  return IsWinVersionOrGreater(_WIN32_WINNT_VISTA, 0);}
BOOL IsWindowsVistaSP1OrGreater(){  return IsWinVersionOrGreater(_WIN32_WINNT_VISTA, 1);}
BOOL IsWindowsVistaSP2OrGreater(){  return IsWinVersionOrGreater(_WIN32_WINNT_VISTA, 2);}
BOOL IsWindows7OrGreater()       {  return IsWinVersionOrGreater(_WIN32_WINNT_WIN7,  0);}
BOOL IsWindows7SP1OrGreater()    {  return IsWinVersionOrGreater(_WIN32_WINNT_WIN7,  1);}
BOOL IsWindows8OrGreater()       {  return IsWinVersionOrGreater(_WIN32_WINNT_WIN8,  0);}
BOOL IsWindows8Point1OrGreater() {  return IsWinVersionOrGreater(_WIN32_WINNT_WINBLUE, 0); }
BOOL IsWindows10OrGreater()      {  return IsWinVersionOrGreater(_WIN32_WINNT_WIN10, 0); }

BOOL IsWindowsServer()
{
    OSVERSIONINFOEXW osvi = { sizeof(osvi), 0, 0, 0, 0,{ 0 }, 0, 0, 0, VER_NT_WORKSTATION };
    DWORDLONG const dwlConditionMask = VerSetConditionMask(0, VER_PRODUCT_TYPE, VER_EQUAL);
    return !VerifyVersionInfoW(&osvi, VER_PRODUCT_TYPE, dwlConditionMask);
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34235151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档