为以前的Windows平台构建我的应用程序

Build my application for a previous Windows platform

本文关键字:构建 我的 应用程序 平台 Windows      更新时间:2023-10-16

背景

我正在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 clientWindows 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"未解决的导入"加载问题)。