windows - windows.h 中的 WINVER 和 _WIN32_WINNT 守卫发生了什么?

标签 windows visual-c++ winapi

Using the Windows Headers , Microsoft 声称 _WIN32_WINNT 和 NTDDI_VERSION 可用于防止为较新版本的 Windows 定义 API 函数。然而,这似乎并不普遍。

例如,CancelSynchronousIo需要 Vista 或更高版本,但在我拥有的两个版本的 Windows SDK(v6.0 和 v7.1)中完全不 protected 。

WINBASEAPI
BOOL
WINAPI
CancelIoEx(
    __in HANDLE hFile,
    __in_opt LPOVERLAPPED lpOverlapped
    );

与此同时,GetVolumeInformationByHandleW ,它也需要 Vista,如您所料受到保护:

#if(_WIN32_WINNT >= 0x0600)
WINBASEAPI
BOOL
WINAPI
GetVolumeInformationByHandleW(
    __in      HANDLE hFile,
    __out_ecount_opt(nVolumeNameSize) LPWSTR lpVolumeNameBuffer,
    __in      DWORD nVolumeNameSize,
    __out_opt LPDWORD lpVolumeSerialNumber,
    __out_opt LPDWORD lpMaximumComponentLength,
    __out_opt LPDWORD lpFileSystemFlags,
    __out_ecount_opt(nFileSystemNameSize) LPWSTR lpFileSystemNameBuffer,
    __in      DWORD nFileSystemNameSize
    );
#endif /* _WIN32_WINNT >=  0x0600 */

这种事情只是一个错误吗? _WIN32_WINT 守卫没用吗?谁能推荐一种可靠的方法来确定哪个版本的 Windows 引入了哪些 API 函数?

编辑添加:

这是一个测试。 foo.h 包含:

#include <windows.h>

然后运行:

cl /E /D_WIN32_WINNT=0x0501 /DNTDDI_VERSION=0x05010000 foo.h | grep CancelSynchronousIo

我的预期是我不会得到任何输出,而是定义了 CancelSynchronousIo。

最佳答案

这是一个错误。引用实例are herehere .一些次要证据表明 Longhorn 项目确实是一个非常麻烦的项目。 Windows 团队不像 DevDiv 那样接受反馈,很难修复错误。您可以在 MSDN Library 页面底部留下注释。

关于windows - windows.h 中的 WINVER 和 _WIN32_WINNT 守卫发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4769430/

相关文章:

windows - 关于NTFS过滤驱动的问题

visual-studio - 如何让qt msvc2013使命令可运行

C++ 在结构定义中初始化一个 vector

c# - 触摸注入(inject)后恢复被抑制的光标

c - 如何用C/C++实现键盘缓冲窗口无阻塞

windows - 适用于 Windows 10 的 Docker

winapi - WS_VSCROLL,CreateWindow样式有效,SetWindowLong不起作用

c++ - 如何在 C++ (Unicode) 中将 std::string 转换为 LPCWSTR

sql-server - Postgresql的独立实例是否可能

c++ - MSVC 是否应该拒绝没有实例化的模板化使用