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

时间:2017-01-10 12:42:26

标签: c++ windows winapi windows-xp

背景

我正在C++上使用VS2015撰写WIN 7个应用。此应用程序将在大于等于XP的所有Windows操作系统上运行。

通过我的代码,我使用了大量的WINAPI调用。

我希望在编译时防止使用未在win XP中定义的API。

动机

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

解决方案

所以,我关注这篇文章:Modifying WINVER and _WIN32_WINNT并声明:

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

中的

我希望在此修复之后,当我编译包含RegDeleteKeyEx function用法的项目时,我将收到编译错误。 但我没有。

QA

我尝试寻找其他人new WINAPI in vista,然后只是添加了对GetTickCount64 function的调用。在编译时,我得到了这个:

error C3861: 'GetTickCount64': identifier not found

证实了我的解决方案。

问题

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

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

如何在此类用例中强制执行编译错误?

1 个答案:

答案 0 :(得分:1)

不幸的是,正如我在“winreg.h”中看到的那样,RegDeleteKeyExRegDeleteKey除外)没有条件编译。因此,在这种情况下,没有(简单的)方法可以触发编译错误。

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

有时这种东西也可以使用动态DLL加载(LoadLibrary / GetProcAdress)来解决,您可以在其中检查应用程序运行的当前Windows版本上是否存在特定函数(因此,您可以创建一个RegDeleteKey包装器,它将在支持它的Windows版本上调用RegDeleteKeyEx,如果在不支持它的版本下运行,则调用RegDeleteKey。然后在运行时检查功能存在,因此程序可以在任何版本的系统上运行,并且仍然使用支持它们的版本上的最新功能(并且在较低版本上没有DLL“未解决的导入”加载问题不支持该功能的版本。)