我正在使用 Visual Studio 2012 在 Windows 7 x64 上执行一些测试。看起来 Microsoft 的工具链正在设置_WIN32_WINNT
to 0x602
(_WIN32_WINNT_WIN8
)。运行我们的测试程序结果The procedure entry point GetOverlappedResultEx could not be located in the dynamic link library KERNEL32.dll
:
![enter image description here](https://i.stack.imgur.com/zx5zZ.png)
我有两个问题。首先,出于病态的好奇,微软为什么要设置_WIN32_WINNT
为对执行环境无效的值?我可以理解用户是否想要这样做,但微软不能,因为它破坏了东西(q.v.).
二、我们如何设置WINVER
or _WIN32_WINNT
到象征性的“这个平台”?在本例中,“此平台”是 Windows 7。当我在 Windows Vista 上测试时,它将是一个不同的平台。当我在 Windows 8 上测试时,它将是另一个平台。当我在 ARM 开发人员提示下测试 Windows Phone 和 Windows Store 时,这将是另一个平台。
这个问题很容易重复。以下是步骤。我想任何拥有良好测试环境的人都已经完成了前八个步骤。
- 启动 Windows 7 x64 计算机
- 对 Windows 7 机器进行全面修补
- 安装 Visual Studio 2008
- 完全修补 Visual Studio 2008
- 安装 Visual Studio 2010
- 完全修补 Visual Studio 2010
- 安装 Visual Studio 2012
- 完全修补 Visual Studio 2012
Then:
- 在VS2008下创建一个空的“Hello World”项目
- Delete 一切 except
hello_world.cpp
(这应该留下 1 个解决方案文件、1 个项目文件、1 个源文件)
- 将其转换为VS2010
- 用VS2012打开
我可以发布 MCVE(一个空源文件)来安抚一些人。这似乎是浪费时间,因为问题出在工具链而不是源文件上。是一个空的main
对于这个问题真的至关重要吗?错的WINVER
and _WIN32_WINNT
无论文件中有什么内容都会被设置。
我知道错误的根源。我们的代码最近进行了更改,以更好地支持Windows 8、Phone 8、Store 8、Server 2012、Windows 10、Phone 10、Store 10 和 Windows 通用平台。变化看起来像这样:
#if defined(CRYPTOPP_WIN32_AVAILABLE)
# if ((WINVER >= 0x0602 /*_WIN32_WINNT_WIN8*/) || (_WIN32_WINNT >= 0x0602 /*_WIN32_WINNT_WIN8*/))
# include <synchapi.h>
# include <ioapiset.h>
# define USE_WINDOWS8_API
# endif
#endif
...
#if defined(USE_WINDOWS8_API)
BOOL result = GetOverlappedResultEx(GetHandle(), &m_overlapped, &m_lastResult, INFINITE, FALSE);
#else
BOOL result = GetOverlappedResult(GetHandle(), &m_overlapped, &m_lastResult, FALSE);
#endif
讽刺的是,我们添加了USE_WINDOWS8_API
,附加包含和调用GetOverlappedResultEx
首先安抚工具。他们抱怨不推荐使用的函数并导致脏编译。脏编译给用户带来了治理、C&A 和 ST&E 问题。
我审核了代码以确保我们不会无意或错误地设置值。我验证我们在一个地方执行此操作,并且代码路径未激活,因为 Microsoft 的工具链正在将值设置为0x602
:
#ifdef CRYPTOPP_WIN32_AVAILABLE
# ifndef _WIN32_WINNT
# define _WIN32_WINNT 0x0400
# endif
#endif
这是一个相关的堆栈溢出问题:什么是WINVER?,但没有讨论如何设置为“这个平台”。
这是微软关于这个主题的文档:使用 Windows 标头 and 修改WINVER和_WIN32_WINNT。讽刺的是,他们并没有真正讨论 Windows 10、Windows Phone 10、Windows Store 10 或 Windows 通用平台的问题。
顺便说一句,GCC 有一个类似的-march=native
基本上提供了“这个平台”。