_WIN32_WINNT 宏如何同时支持win7和winxp?

4

我正在使用Windows 7上的VS2012开发我的代码,代码需要在Windows 7和XP上运行。如果我把_WIN32_WINNT宏设置为以下值,那么我的代码能同时在Windows 7和XP上运行吗?

#define _WIN32_WINNT 0x0601

?


3
不,它可能不能在XP上运行。您可以使用“0x0501”来支持XP和Win7。 - Roger Rowland
2个回答

3
_WIN32_WINNT 定义在这里描述:http://msdn.microsoft.com/zh-cn/library/6sehtctf.aspx 它的意思是,当你
#include <windows.h>

只有在 Windows 版本中数值表示为 _WIN32_WINNT 的函数原型才可用,因此需要进行静态链接。由于编译器只会引用操作系统中的可用函数来进行静态链接,因此可执行文件将正常工作。
但是,即使您不修改 _WIN32_WINNT,只要您仅使用目标操作系统的函数,可执行文件就应该可以正常工作,但显然您需要测试一下,而不是依赖自己对每个操作系统版本中哪些函数可用或不可用的了解。
如果您尝试使用一个仅由较新版本的操作系统提供的函数的可执行文件,则运行可执行文件时会出现一个显示“DLL 导入未找到”的消息框。

我很感激您的解释,但我猜想我们中许多人在寻找答案时已经了解了那个链接。微软的文档并没有清楚地描述设置宏的影响。文档侧重于如何设置宏,这很好,但并不涉及含义。我已经多次阅读了那份文档,但写得非常糟糕。例如,通常我不需要知道如何设置宏,我需要知道每个值的真正含义以及其后果。 - shawn1874
我从这些回复中了解到,最早的目标操作系统是由宏指定的。所指定的目标涉及权衡。您针对的早期版本,获得的能力越少。另一方面,针对较新版本可能会导致问题,如果您需要应用程序在早期版本上运行。因此,归根结底,如果您需要软件在Windows 7上运行,则必须针对Windows 7或冒险尝试某些功能无法正常工作。这是我的解释,我不能从MSDN上确定。 - shawn1874

1
如果你通过_WIN32_WINNT瞄准Windows的一个版本,那么代码将使用该平台上可用的所有函数。这意味着,如果你瞄准Windows 7,则某些Win7及以上的功能将对你可用,但在Windows XP上不可用。一般来说,你的可执行文件将在Windows 7及以上版本上运行,而不能在Vista或XP上运行。
另一方面,如果你瞄准Windows XP,则可以在Windows 7上运行程序而无需问题,尽管可能会错过一些新功能。
如果你只需要Windows 7中的一两个函数,那么有一些技术,比如动态加载DLL和使用GetProcAddress来加载函数入口点,以便能够使用新函数但仍能在XP上运行。

*) 如果你的目标是 Windows 7 并尝试在 XP 上运行,那么不确定会发生什么。只要你限制自己使用 XP 中的函数子集,并且你幸运地没有使用新的标志值和大小发生变化的结构体,那么它可能会运行,但当然不能保证。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接