_WIN32_WINNT macro for both win7 and winxp

_WIN32_WINNT macro for both win7 and winxp

本文关键字:win7 and winxp both for WIN32 WINNT macro      更新时间:2023-10-16

我正在使用Windows 7上的VS2012开发我的代码。它必须在Windows 7和XP上运行。如果我按如下方式设置宏_WIN32_WINNT我的代码是否会在 Windows 7 和 XP 上运行:

#define _WIN32_WINNT 0x0601

这里

描述了_WIN32_WINNT定义http://msdn.microsoft.com/en-us/library/6sehtctf.aspx

这意味着当你

#include <windows.h>

仅提供由 _WIN32_WINNT 数字表示的 Windows 版本中可用的函数原型,因此是静态链接的。 由于编译器仅引用操作系统中的可用函数进行静态链接,因此可执行文件将起作用。

但是,即使您不修改_WIN32_WINNT只要您只使用目标操作系统中的函数,可执行文件也应该可以正常工作,但显然您希望对此进行测试,而不是依靠自己了解哪些功能在每个版本的操作系统中可用和不可用。

如果您尝试使用仅使用更高版本的操作系统提供的函数的可执行文件,则在运行可执行文件时,您将看到一个消息框,上面写着"找不到 DLL 导入"。

如果您通过 _WIN32_WINNT 面向某个版本的 Windows,则该代码将使用该平台可用的所有功能。这意味着,如果您面向Windows 7,则可以使用某些Win7及以上的功能,但这些功能在Windows XP上不可用。通常,您的可执行文件将在Windows 7及更高版本上运行,而不是在Vista或XP上运行。*

另一方面,如果您的目标是Windows XP,那么您将能够毫无问题地在Windows 7上运行该程序,尽管您可能会错过一些新功能。

如果您只需要一个或两个仅在 Windows 7 中可用的函数,那么有一些技术,例如使用 GetProcAddress 动态加载 DLL 和函数入口点,以便能够使用新功能但仍能在 XP 上运行。


*)如果您以Windows 7为目标并尝试在XP上运行,则不能100%确定会发生什么。只要您将自己限制在XP中的函数子集,并且您碰巧没有使用新的标志值并且没有大小已更改的结构,那么它可能会运行,但当然不能保证。