windows.h中的WINVER和_WIN32_WINNT宏定义发生了什么变化?

8
使用Windows头文件中,微软声称可以使用_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 */

这种情况只是个bug吗?_WIN32_WINT守卫无用吗?有人能推荐一种可靠的方法来确定哪个版本的Windows引入了哪些API函数吗?
编辑后添加:
下面这是一个测试。foo.h包含:
#include <windows.h>

然后运行:
cl /E /D_WIN32_WINNT=0x0501 /DNTDDI_VERSION=0x05010000 foo.h | grep CancelSynchronousIo

我的期望是不会得到任何输出,但实际上定义了CancelSynchronousIo。

2
我使用 MSDN。 我会提供链接,但我看到你已经有了。具体来说,它在“要求”部分提供“最低支持客户端”和“最低支持服务器”。还值得注意的是:WINVER、_WIN32_WINNT、_WIN32_WINDOWS 和 _WIN32_IE 之间有什么区别? - Cody Gray
1个回答

7

这是一个bug。参考示例在此在此。有一些次要证据表明Longhorn项目确实存在很多问题。Windows团队不像DevDiv那样接受反馈,很难修复bug。您可以在MSDN Library页面底部留下注释。


3
所以我决定做一个小实验。有数百个从kernel32导出的错误守卫函数。详情请见:http://www.kndr.org/windows-sdk-brokenness - Ross Kinder
иҝҷдёӘй—®йўҳдёҚд»…йҖӮз”ЁдәҺд»Һkernel32.dllеҜје…Ҙзҡ„еҮҪж•°пјҢиҖҢдё”жҲ‘д№ҹеҸ‘зҺ°е®ғеҮәзҺ°еңЁд»Һadvapi32.dllдёӯзҡ„Perf*ж–№жі•дёҠгҖӮ - nothrow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接