【发布时间】: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。
【问题讨论】:
-
我使用 MSDN。我会提供链接,但我看到你已经有了。具体来说,“要求”部分提供了“最低支持的客户端”和“最低支持的服务器”。也感兴趣:What's the difference between WINVER, _WIN32_WINNT, _WIN32_WINDOWS, and _WIN32_IE?.
标签: windows visual-c++ winapi