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

Build my application for a previous Windows platform

背景

我正在 WIN 7 上使用 VS2015 编写一个 C++ 应用程序。此应用程序将 运行 所有 windows OS 大于等于 XP.

在我的代码中,我使用了很多 WINAPI 调用。

我希望在编译时阻止使用未在 win XP.

中定义的 API

动机

在某些时候,我使用了函数 RegDeleteKeyEx function 而没有注意到这个 API 在 win XP

中不可用

解决方案

所以,我遵循这个 post:Modifying WINVER and _WIN32_WINNT 并声明:

#include <winsdkver.h>
#define _WIN32_WINNT        0x0501         
#define WINVER              0x0501 

在文件中 targetver.h

我希望在这个修复之后,当我编译包含 RegDeleteKeyEx function 用法的项目时,我会得到编译错误。 但是我没有。

质量检查

我尝试寻找其他 new WINAPI in vista, and just added a call to GetTickCount64 function。编译时,我得到了这个:

error C3861: 'GetTickCount64': identifier not found

证实了我的解决方案。

问题

我注意到对于 RegDeleteKeyEx functionMinimum supported clientWindows Vista, Windows XP Professional x64 Edition

但是,我的应用程序也会 运行 在 XP 32 中。

如何在这种用例中强制执行编译错误?

不幸的是,正如我在 "winreg.h" 中看到的那样,没有 RegDeleteKeyEx 的条件编译(RegDeleteKey 除外)。所以在这种情况下没有(简单的)方法来触发编译错误。

唯一的选择(对于常规静态 DLL 加载)是在 winreg.h(或 windows.h)上创建您自己的包装器,它将处理版本检查(例如 #undef RegDeleteKeyEx在相应的情况下)。


有时也可以使用动态 DLL 加载 (LoadLibrary / GetProcAdress) 解决此类问题,您可以在其中检查当前版本 Windows 上是否存在特定功能,其中应用程序 运行s(因此您可以创建一个 RegDeleteKey 包装器,它会在支持它的 windows 版本上调用 RegDeleteKeyEx,如果 RegDeleteKey 运行 在没有的版本下)。然后在 运行 时间检查功能是否存在,因此该程序可以 运行 在任何系统版本上,并且仍然在支持它们的版本上使用最新功能(并且没有 DLL "unresolved import" 在不支持该功能的低版本上加载问题。