加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

windows.h中的WINVER和_WIN32_WINNT警卫怎么了?

发布时间:2020-12-14 04:06:41 所属栏目:Windows 来源:网络整理
导读:在 Using the Windows Headers,Microsoft声称_WIN32_WINNT和NTDDI_VERSION可用于防止为较新版本的Windows定义API函数.但是,这似乎并不普遍. 例如,CancelSynchronousIo需要Vista或更高版本,但在我拥有的两个版本的Windows SDK(v6.0和v7.1)中根本没有防范. WIN
在 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.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读