为以前的Windows平台构建我的应用程序
Build my application for a previous Windows platform
背景
我正在WIN 7
上使用VS2015
编写一个C++
应用程序。此应用程序将在大于等于XP
的所有windows操作系统上运行。
在我的代码中,我使用了很多WINAPI调用。
我希望在编译时防止使用winXP
中未定义的API。
动机
在某个时刻,我使用了函数RegDeleteKeyEx函数,但没有注意到这个API在winXP
中不可用
解决方案
因此,我关注这篇文章:修改WINVER和_WIN32_WINNT并声明:
#include <winsdkver.h>
#define _WIN32_WINNT 0x0501
#define WINVER 0x0501
在文件targetver.h
中
我希望在这个修复之后,当我编译包含RegDeleteKeyEx function
用法的项目时,我会出现编译错误。但我没有。
QA
我尝试在vista
中寻找其他新的WINAPI,并添加了对GetTickCount64函数的调用。编译时,我得到了这个:
error C3861: 'GetTickCount64': identifier not found
这证实了我的解决方案。
问题
我注意到,对于RegDeleteKeyEx函数,Minimum supported client
是Windows Vista, Windows XP Professional x64 Edition
不过,我的应用程序也将在XP 32中运行。
在这种用例中,我如何强制执行编译错误
不幸的是,正如我在"winreg.h"中看到的,RegDeleteKeyEx
(除了RegDeleteKey
)没有条件编译。因此,在这种情况下,没有(简单的)方法来触发编译错误。
唯一的选择(对于常规静态DLL加载)是在winreg.h(或windows.h)上创建自己的包装器,该包装器将处理版本检查(例如,在相应的情况下为#undef RegDeleteKeyEx
)。
有时,这类问题也可以使用动态DLL加载(LoadLibrary
/GetProcAdress
)来解决,在动态DLL加载中,您可以检查应用程序运行的当前版本的Windows上是否存在特定函数(例如,您可以创建一个RegDeleteKey
包装器,它将在支持它的Windows版本上调用RegDeleteKeyEx
,如果在不支持它的版本下运行,则调用RegDeleteKey
)。然后在运行时检查功能是否存在,因此程序可以在任何版本的系统上运行,并且仍然在支持它们的版本上使用最新功能(并且在不支持该功能的较低版本上没有DLL"未解决的导入"加载问题)。
- 我适合在我的构建系统中使用 shell 脚本而不是AX_CHECK_COMPILE_FLAG吗?
- 我必须构建我的项目 2 次,第一次失败,因为它无法打开库
- 如何在Cmake中正确查找头路径,以便在我的项目中构建Box2D
- 如何在构建时改进我的脚本和复制程序资源?
- 如何构建默认使用我自己的构建libc ++的clang?
- SQLite - 从源代码构建库或将源代码直接包含在我的项目中
- 为什么当我的项目是使用 Android NDK r16 构建时,我会收到来自 Android NDK r11 的错误消息
- 我的lambda在复制构建期间没有正确转换捕获的"this"
- 如何确保Win-Builder用C 11构建我的包裹
- 使用QtCreator,如何在我有权访问ssh的远程服务器上构建我的项目?
- 为以前的Windows平台构建我的应用程序
- Xcode 拒绝构建我的一个 OpenCL 项目,但成功构建了另一个项目
- 有人可以解释为什么我的 cmake 文件无法构建我的 cpp 文件
- 构建我的 ROS 节点时出错
- 如何在 Mac 上使用 clang 构建我的C++代码
- 使用批处理文件使用 Cmake & Msbuild (vs2010) 一键构建我的项目
- 我可以用矢量(OpenGL)构建我的网格吗?
- 需要帮助构建我的Makefile
- 无法使用Microsoft Visual Studio 2010构建我的代码
- 如何使用g++ 4.7或更新版本强制launchpad构建我的包?