关于_WIN32_WINNT

victor_cui 2004-08-05 03:03:08
小弟开发一个程序,用到了TryEnterCriticalSection,MSDN上说必须为2000和以后的版本上才可使用:
Windows NT/2000 or later: Requires Windows NT 4.0 or later.
Windows 95/98/Me: Unsupported.
Header: Declared in Winbase.h; include Windows.h.
Library: Use Kernel32.lib.
可是我按其要求包含了头文件,程序编译时说找不到该函数,看了头文件才知道
_WIN32_WINNT没有被定一所致,请问为什么会有这种情况,这个环境变量是在哪里定义的呀!!!
...全文
827 点赞 收藏 5
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
dlscdn 2004-08-05
mark
回复
stdafx.h
=============
有关WINVER和_WIN32_IE宏的平台定义(MSDN开掘编译)
<<如何让你的应用程序正确支持不同的Windows版本 -- MSDN的WINVER解析>>

使用VC5.0/6.0自动产生的 .mak 文件是缺省针对 WinNT3.5的. 这样要使用NT4+以后的函数则受到了条件型代码的博阿户, 必须定义正确的应用程序宏进行设置. 否则, 你可能得到下列错误:
error C2065: undeclared identifier.
你也需要确保 INCLUDE 环境变量包含所需函数的SDK头文件路径位于VC的头文件路径之前. 否则你会在发布应用程序时得到 C2065 错误.

下面是你需要针对不同系统所定义的宏:
Windows 95 and Windows NT 4.0 WINVER=0x0400

Windows 98 and Windows NT 4.0 _WIN32_WINDOWS=0x0410 and WINVER=0x0400

Windows NT 4.0 _WIN32_WINNT=0x0400 and WINVER=0x0400

Windows 98 and Windows 2000 WINVER=0x0500

Windows 2000 _WIN32_WINNT=0x0500 and WINVER=0x0500

Internet Explorer 3.0 _WIN32_IE=0x0300

Internet Explorer 4.0 _WIN32_IE=0x0400

Internet Explorer 5.0 _WIN32_IE=0x0500


注意: 设置 WINVER 为 0x0500 可以缺省 _WIN32_IE=0x0400.

如果你需要自己编写 .mak 文件, WIN32.MAK 内的宏有助于你进行正确地转换. _WIN32_WINNT 在 WIN32.MAK 基于你选择的操作系统而被设置. 缺省情况下, WIN32.MAK 定义 _WIN32_WINNT 等于 0x0400, _WIN32_IE 等于 0x0300. 如果需要使用 IE4+ 的新特性, 比如新增的通用控件等, 就需要重新设置 _WIN32_IE 等于 0x0400.

如果你在你的 mak 文件里面没有包含 WIN32.MAK , 就需要额外定义 _WIN32_WINNT 等于 0x0500 得到 win2000的机制.

SDK 头文件使用判断语句决定系统对应的支持函数. 下面的表格描述了这些语句.

#if _WIN32_WINNT >= 0x0400 WinNT4+ , 在win95中不被实现

#if _WIN32_WINDOWS >= 0x0410 Win98. 图象在Win95不保证显示正常

#if _WIN32_WINNT >= 0x0500 Win2000. 图象在 Win9x 或者 NT 上不保证显示正常

#if WINVER >= 0x0500 Win2000/Win98. 图象在Win95/NT上不保证显示正常

#if _WIN32_IE >= 0x0300 IE3+
#if _WIN32_IE >= 0x0400 IE4+
#if _WIN32_IE >= 0x0500 IE5+

对于 Win95se2 而言某些函数需要 (_WIN32_WINNT >= 0x0400) 进行判断, 诸如 Crypto API. 如果你针对 Win95se2进行应用编程, 而你需要使用这些函数的话就需要设置 _WIN32_WINNT 为 0x0400. 注意, 使用这些函数的应用程序在其他版本的 win95 上面可能运行不正常. 通常意义上, 应用程序缺省在win95上面运行就比如在编译时包含 _WIN32_WINNT 定义.
回复
DentistryDoctor 2004-08-05
也可以在程序的C++的预处理器中设置
回复
silklove 2004-08-05
_WIN32_WINNT
需要你自已在stdafx.h头文件中定义.编译器根据此宏来确定windows的版本,如果你需要使用高版本的WIN32函数,只有你定义了此宏后才能使用;

Windows XP _WIN32_WINNT>=0x0501
Windows 2000 _WIN32_WINNT>=0x0500
Windows NT 4.0 _WIN32_WINNT>=0x0400
Windows Me _WIN32_WINDOWS=0x0490
Windows 98 _WIN32_WINDOWS>=0x0410
Internet Explorer 6.0 _WIN32_IE>=0x0600
Internet Explorer 5.01, 5.5 _WIN32_IE>=0x0501
Internet Explorer 5.0, 5.0a, 5.0b _WIN32_IE>=0x0500
Internet Explorer 4.01 _WIN32_IE>=0x0401
Internet Explorer 4.0 _WIN32_IE>=0x0400
Internet Explorer 3.0, 3.01, 3.02 _WIN32_IE>=0x0300
回复
蒋晟 2004-08-05
在包含Windows.h之前
通常在stdafx.h开头定义
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2004-08-05 03:03
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……