WINVER和WINDOWS.h中的_WIN32_WINNT警卫发生了什么?

在使用Windows头文件时 ,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 ); 

同时,也需要Vista的GetVolumeInformationByHandleW被守卫着,正如你所期望的那样:

 #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函数?

编辑添加:

这是一个testing。 foo.h包含:

 #include <windows.h> 

然后运行:

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

我的期望是,我没有得到输出,而是CancelSynchronousIo被定义。

Solutions Collecting From Web of "WINVER和WINDOWS.h中的_WIN32_WINNT警卫发生了什么?"

这是一个错误。 参考例子在这里和这里 。 一些次要的证据表明,Longhorn项目确实是一个非常困难的项目。 Windows团队不会像DevDiv那样收到反馈,很难修正错误。 您可以在MSDN Library页面的底部留下注释。