【问题标题】:What happened to WINVER and _WIN32_WINNT guards in windows.h?windows.h 中的 WINVER 和 _WIN32_WINNT 守卫发生了什么?
【发布时间】:2011-01-23 02:46:00
【问题描述】:

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

例如,CancelSynchronousIo 需要 Vista 或更高版本,但在我拥有的两个版本的 windows SDK(v6.0 和 v7.1)中根本没有保护它。

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。

【问题讨论】:

标签: windows visual-c++ winapi


【解决方案1】:

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

【讨论】:

  • 所以我决定做一个小实验。从 kernel32 导出了 数百个 错误保护的函数。详情:kndr.org/windows-sdk-brokenness
  • 这个问题不仅适用于从kernel32.dll 导入的函数,而且我也发现它也适用于advapi32.dllPerf* 方法。
猜你喜欢
  • 2017-11-27
  • 2016-04-26
  • 1970-01-01
  • 1970-01-01
  • 2017-01-29
  • 2016-07-30
  • 2015-03-04
  • 2011-03-30
  • 2022-01-22
相关资源
最近更新 更多