我正在使用Visual Studio 2012在Windows 7 x64上进行一些测试。看起来微软的工具链将_WIN32_WINNT设置为0x602(_WIN32_WINNT_WIN8)。运行我们的测试程序会导致
其次,我们如何将
问题很容易复制。以下是步骤。我想任何具有良好测试环境的人都已经完成了前八个步骤。
我知道错误的起源。我们的代码最近进行了更改,以更好地支持Windows 8、Phone 8、Store 8、Server 2012、Windows 10、Phone 10、Store 10和Windows通用平台。更改如下所示:
具有讽刺意味的是,我们最初添加了
我审核了代码,以确保我们没有意外或错误地设置值。我验证了我们只在一个地方进行了设置,并且代码路径未被激活,因为Microsoft的工具链正在将该值设置为
这里有一个相关的Stack Overflow问题:什么是WINVER?,但它并没有讨论如何将其设置为“此平台”。
这是Microsoft关于这个主题的文档:使用Windows头文件和修改WINVER和_WIN32_WINNT。具有讽刺意味的是,它们并没有真正讨论问题或Windows 10、Windows Phone 10、Windows Store 10或Windows Universal Platform。
顺便说一下,GCC有一个准类似的
无法在动态链接库KERNEL32.dll中找到GetOverlappedResultEx过程入口点
。
我有两个问题。首先,出于好奇心,微软为什么要将_WIN32_WINNT
设置为执行环境无效的值?我可以理解如果用户需要这样做,但是微软这样做会破坏一些东西(详见参考文献)。其次,我们如何将
WINVER
或_WIN32_WINNT
设置为符号“此平台”?在这种情况下,“此平台”是Windows 7。当我在Windows Vista上测试时,它将是另一个平台。当我在Windows 8上测试时,它将是另一个平台。当我在Windows Phone和Windows Store的ARM开发人员提示下测试时,它将是另一个平台。
问题很容易复制。以下是步骤。我想任何具有良好测试环境的人都已经完成了前八个步骤。
- 搭建一个Windows 7 x64机器
- 完全打补丁Windows 7机器
- 安装Visual Studio 2008
- 完全打补丁Visual Studio 2008
- 安装Visual Studio 2010
- 完全打补丁Visual Studio 2010
- 安装Visual Studio 2012
- 完全打补丁Visual Studio 2012
然后:
- 在VS2008下创建一个空的“Hello World”项目
- 删除除了
hello_world.cpp
之外的所有内容(这应该留下1个解决方案文件,1个项目文件和1个源文件) - 将其转换为VS2010
- 使用VS2012打开
我知道错误的起源。我们的代码最近进行了更改,以更好地支持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
这里有一个相关的Stack Overflow问题:什么是WINVER?,但它并没有讨论如何将其设置为“此平台”。
这是Microsoft关于这个主题的文档:使用Windows头文件和修改WINVER和_WIN32_WINNT。具有讽刺意味的是,它们并没有真正讨论问题或Windows 10、Windows Phone 10、Windows Store 10或Windows Universal Platform。
顺便说一下,GCC有一个准类似的
-march=native
选项,基本上提供了“此平台”的功能。
_WIN32_WINNT
设置为0x602
(_WIN32_WINNT_WIN8
)”。我们没有设置WINVER
或_WIN32_WINNT
- 微软的工具链正在设置它,我不清楚如何向您提供除了我们不这样做的声明之外的任何其他内容。我只能提供证据表明我们对微软错误的值做出反应。 - jww