我发现SetProcessDEPPolicy
(in WinBase.h
) 的函数定义仅在_WIN32_WINNT >= 0x601
. 为什么 MingW32_WIN32_WINNT = 0x400
为 Windows 7 设置了排除定义?我检查了kernel32.dll
Windows 7),它包含的SetProcessDEPPolicy
功能没问题。
2 回答
我发现只有当 _WIN32_WINNT >= 0x601 时才包含 SetProcessDEPPolicy 的函数定义(在 WinBase.h 中)。
但是,在MSDN上,它说您需要将其定义为_WIN32_WINNT >= 0x600
带有 SP1 的 Windows Vista 及更高版本。适用于 Window 7。在此处0x601
阅读有关 Windows 标头的更多信息。
对于每个新版本的 Windows,Windows API 都会更改以添加新功能。Windows 头文件告诉编译器哪个函数在哪个版本的 Windows 上可用。
为什么 MingW32 为 Windows 7 设置 _WIN32_WINNT = 0x400 以排除定义?
因为如果不是这样,那么使用 MingW 编译的所有应用程序很可能只能在 Window 7 及更高版本上运行。
当您_WIN32_WINNT
在项目中定义时,您只是告诉编译器您的目标是哪个版本的 Windows。如果您将其定义为0x0601
能够调用类似的函数,SetProcessDEPPolicy
那么您的应用程序将无法在早期版本的 Windows 上运行。
要支持尽可能多的 Windows 版本,您需要降级_WIN32_WINNT
到您希望应用程序在其上运行的最低版本的 Windows。这将确保您的应用程序使用的是通用的 API,并且可用于您的目标版本及更高版本。但这将排除在更高版本的 Windows 上引入的所有“新”功能。
默认情况下,MingW 设置_WIN32_WINNT = 0x400
为使您的应用程序可以在所有可能的 Windows 版本上运行。但是,如果您的应用程序需要调用特定版本的 Windows 上可用的函数,那么您需要更改_WIN32_WINNT
为适当的版本才能执行此操作。
这是正常的,也正是它应该是的样子。
在您的应用程序中,您需要设置_WIN32_WINNT
您的目标 Windows 版本,以便获得适当的 API。
来自 MSDN:
要编译调用此函数的应用程序,请定义
_WIN32_WINNT
为 0x0600 或更高版本。
MingW 很可能设置了一个合理的默认值(NT4.0),允许您在需要时增加它。