我正在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
用法的项目时,我将收到编译错误。
但我没有。
我尝试寻找其他人new WINAPI in vista
,然后只是添加了对GetTickCount64 function的调用。在编译时,我得到了这个:
error C3861: 'GetTickCount64': identifier not found
证实了我的解决方案。
我注意到RegDeleteKeyEx function,Minimum supported client
为Windows Vista, Windows XP Professional x64 Edition
但是,我的应用程序也将在XP 32中运行。
如何在此类用例中强制执行编译错误?
答案 0 :(得分:1)
不幸的是,正如我在“winreg.h”中看到的那样,RegDeleteKeyEx
(RegDeleteKey
除外)没有条件编译。因此,在这种情况下,没有(简单的)方法可以触发编译错误。
唯一的选择(对于常规的静态DLL加载)是在winreg.h(或windows.h)上创建自己的包装器,它将处理版本检查(例如在相应的情况下为#undef RegDeleteKeyEx
)
有时这种东西也可以使用动态DLL加载(LoadLibrary
/ GetProcAdress
)来解决,您可以在其中检查应用程序运行的当前Windows版本上是否存在特定函数(因此,您可以创建一个RegDeleteKey
包装器,它将在支持它的Windows版本上调用RegDeleteKeyEx
,如果在不支持它的版本下运行,则调用RegDeleteKey
。然后在运行时检查功能存在,因此程序可以在任何版本的系统上运行,并且仍然使用支持它们的版本上的最新功能(并且在较低版本上没有DLL“未解决的导入”加载问题不支持该功能的版本。)