在使用Windows头文件中,微软声称可以使用_WIN32_WINNT和NTDDI_VERSION来防止为新版本的Windows定义API函数。然而,这似乎并不是普遍适用的。
例如,CancelSynchronousIo需要Vista或更高版本,但在我拥有的两个版本的Windows SDK(v6.0和v7.1)中都没有保护措施。
这种情况只是个bug吗?_WIN32_WINT守卫无用吗?有人能推荐一种可靠的方法来确定哪个版本的Windows引入了哪些API函数吗?
编辑后添加:
下面这是一个测试。foo.h包含:
然后运行:
我的期望是不会得到任何输出,但实际上定义了CancelSynchronousIo。
例如,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 */
这种情况只是个bug吗?_WIN32_WINT守卫无用吗?有人能推荐一种可靠的方法来确定哪个版本的Windows引入了哪些API函数吗?
编辑后添加:
下面这是一个测试。foo.h包含:
#include <windows.h>
然后运行:
cl /E /D_WIN32_WINNT=0x0501 /DNTDDI_VERSION=0x05010000 foo.h | grep CancelSynchronousIo
我的期望是不会得到任何输出,但实际上定义了CancelSynchronousIo。