



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
关于_WIN32_WINNT的含义(2011-02-28 14:41:44)转载从 Visual C+ 2008 开始,Visual C+ 不支持面向 Windows 95、Windows 98、Windows ME 或 Windows NT。如果您的WINVER或_WIN32_WINNT宏被指定到这些 Windows 版本之一,则需要修改宏。当升级从 Visual C+ 的以前版本创建的项目时,如果将WINVER或_WIN32_WINNT宏指定到不再受支持的 Windows 版本,可能会看到与这些宏相关的编译错误。若要修改宏,请在头文件中添加以下行:#define WINVER 0x0500 #define_WIN32_WINNT0x0500这将以 Windows 2000 操作系统为目标。其他有效值包括 0x0501(用于 Windows XP)、0x0502(用于 Windows Server 2003)和 0x0600(用于 Windows Vista)。需要你自已在stdafx.h头文件中定义。编译器根据此宏来确定windows的版本,如果你需要使用高版本的WIN32函数,只有你定义了此宏后才能使用WindowsXP_WIN32_WINNT=0x0501Windows2000_WIN32_WINNT=0x0500WindowsNT4.0_WIN32_WINNT=0x0400WindowsMe_WIN32_WINDOWS=0x0490Windows98_WIN32_WINDOWS=0x0410InternetExplorer6.0_WIN32_IE=0x0600InternetExplorer5.01,5.5_WIN32_IE=0x0501InternetExplorer5.0,5.0a,5.0b_WIN32_IE=0x0500InternetExplorer4.01_WIN32_IE=0x0401InternetExplorer4.0_WIN32_IE=0x0400InternetExplorer3.0,3.01,3.02_WIN32_IE=0x0300VC6里的_WIN32_WINNT宏VC6 使用基础一、 VC6 + XPSP2 SDK 使用方法:当我们在 VC6 中写这样的代码:CString buffer1, buffer2;buffer1.Format(_WIN32_WINNT=%x,_WIN32_WINNT);buffer2.Format(WINVER=%x, WINVER);MessageBox(buffer1, buffer2, MB_OK);SetWindowLong(this-GetSafeHwnd(), GWL_EXSTYLE, GetWindowLong(this-GetSafeHwnd(), GWL_EXSTYLE) WS_EX_LAYERED);SetLayeredWindowAttributes(this-GetSafeHwnd(), 0, 127, LWA_ALPHA);编译不能通过,这是为什么呢?VC6 是 98 年出来的,对 Win2k 系统上才有的 API 无法直接调用。虽然我们可以动态调用 DLL 的方式来使用它的 API,但是这样很不方便。升级 SDK 可以解决以上问题,目前所知,仅有两个版本支持 VC6,一个是 Server2003 SDK,另一个就是 XPSP2 SDK ,可以查阅我前面写的 Microsoft Platform SDK 的文章,里面有它们的下载地址。我在 XP 系统上使用 VC,所以这里下载 XPSP2 SDK 。SDK 安装完成后,在“开始菜单程序Microsoft Platform SDK for Windows XP SP2Visual Studio Registration” 里可以找到 Register PSDK Directories with Visual Studio 项,它能将 SDK 中的头文件和库文件目录配置到 VC6 的头文件和库文件搜索目录项中。但是,这样做完后还不能使 VC 直接调用 Win2k API。这是因为目前在 SDK 里,头文件中使用_WIN32_WINNT来标识可使用的 API 函数集。它的取值不同,可使用的 API 函数范围也不同。我们在 Platform SDK for Windows XP SP2 帮助中的 Index 标签页中输入_WIN32_WINNT可以看到一篇文章:Using the Windows Headers ;你也可以这样打开它:切换到 Contents 标签页: Development Guides - Windows API - Window API Reference - Using the Windows Headers 。这篇文章告诉我们有两个关键的宏定义,它们的取值所表达的意思就是系统版本号。头文件中就是使用该值来包含对应系统版本的 API 函数头的。比如我们要使用 SetLayeredWindowAttributes() ,该 API 被声明在 WinUser.h 文件中,打开该文件,我们会发现在它后面有 /*_WIN32_WINNT= 0x0500 */ 注释,即如果我们定义_WIN32_WINNT= 0x0500,就可以使用该函数。而 0x0500 正是指的 Win2k,所以该函数在 Win2k 及以上版本中才存在,这就是版本控制。为了保证 VC6 和 SDK 的兼容性,我们取的 API 函数集应该限制在 Win2k 系统里,即要这样定义:#define WINVER 0x0500#define_WIN32_WINNT0x0500哦,想必大家已经看出来了,是的,_WIN32_WINNT定义没有写在 Windows.h 中,就是要让用户自己指定所使用的 API 函数集范围。但是如果没有定义 WINVER,则在 Windows.h 中它会这么做 #define WINVER 0x0501而在 WinUser.h 中它会这么做 #define WINVER 0x0500 /* version 5.0 */故,我们最好先定义一下它们,使 API 和常量定义的使用范围更明确些。最好的方案是在程序引用 Windows.h 之前定义它们,但是对于 MFC 程序,我们很难找到定义处,因为类封装了它。怎么办呢?我在这里提供两个可选方法:方法一:在编译预处理中指定新建工程,点主菜单,Project - Settings 打开 Project Settings 对话框。或者按 ALT + F7 直接打开该对话框。找到 C/C+ 标签页, 在 Category: 下拉菜单中选择 General,可看到底下 Preprocessor definitions: 编辑框,在里面填入_WIN32_WINNT=0x0500每个预处理标识符都是用逗号分隔的。当你这么填入后点确定,它会在下面的 Project Options: 框里加上/D WIN32_WINNT=0x0500 选项。它相当于下面这条语句:#define_WIN32_WINNT0x0500其实我们应该定义两个,#define WINVER 0x0500#define_WIN32_WINNT0x0500只不过我们在这里指定 WINVER 会发生重复,编译器会报错。查看 Windows.h 头文件,发现有 WINVER 定义。所以编译器是先处理文件,当找不到相应常量时才会使用在编译器中指定的。虽然这里我们不加上 /D WINVER=0x0500,在该 XPSP2 SDK 中会自动在 Windows.h 中定义 #define WINVER 0x0501 ,程序依然可以使用 Win2k API,但是如果不小心使用了 XP 的 API,可能会造成不兼容的问题,比如程序可以编译但不能连接,或者编译连接正常,但运行会出错等,这些问题就不太好查了。所以,我建议,两个都要先定义。怎么才能做到呢?请看下面的方法:方法二:修改 Windows.h 文件法我想你也注意到了,既然_WIN32_WINNT是没有定义的符号,我们就在 Windows.h 中将它加上好了。如果你的源程序不需要拿到其它环境里去编译,完全可以这么做。如果你确定要这么干,这里我有个更好的做法,不改变原 Windows.h, 而是复制一份到另一个目录里,然后修改这个副本,在文件开头添加#define WINVER 0x0500#define_WIN32_WINNT0x0500然后我们再到 VC 集成环境中,选 Tools - Options,打开 Options 对话框,找到 Directories 标签页,在 Show directories for: 下拉列表中选择 include files,在里面添加副本所在目录,比如 c:win2k.inc, 并将其移到最上面,这样无论编译什么,就算是 MFC 工程, 一样可以使用 Win2k API 。二、VC 中新建的工程第一次应该使用 Rebuild All 。在VC中,新建立的工程第一次编译,应该使用主菜单中的Build - Rebuild All这是因为 VC 有时候不重新编译一些公共文件,造成编译连接错误。本来 VC 是为了加速编译速度,不对公共文件重新编译,但有时新建了工程,它也不重新编译,还用先前那个,这就会造成编译连接错误。为了不必要的麻烦,在一开始将所有的文件全部 Rebuild All 一次。注意,在菜单 Build 中, Rebuild All 的图标带三个小箭头,而 Build 旁边没有图标,但是在 Build MiniBar 工具条上的 Build 是带二个小箭头的图标,注意分清楚。以前我使用 VC 时,就误解了 Build MiniBar 上的图标和 Rebuild All 的图标,就是因为在主菜单 Build 中没有标出 Build 的二箭头图标,害得我好几次出了问题不知所云。如果不清楚,最好直接使用主菜单。三、在 VC 中,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 主题10 主要地貌类型教学设计-2025-2026学年高中地理中图中华地图版必修第一册-中图中华地图版2020
- 感光材料乳剂熔化工协同作业考核试卷及答案
- 重金属煅烧工质量追溯知识考核试卷及答案
- 2025呼伦贝尔鄂温克族自治旗融媒体中心多元化岗位招聘工作人员笔试备考及答案详解(考点梳理)
- 工程机械租赁业务员专业知识考核试卷及答案
- 非织造布卷绕分切工安全规范考核试卷及答案
- 转炉炼钢工应急处置考核试卷及答案
- 机械安全培训课件
- 机械安全培训班开班课件
- 山东省郯城县红花镇初级中学八年级地理上册 1.3 民族说课稿2 (新版)新人教版
- 导管相关性血流感染预防策略
- 《管理学基础与实务》 课件 曾宪达 第1-5章 管理与管理者- 目标与计划
- 茶艺知识讲座课件
- 股份赠予员工协议书模板
- 合成氨设备管理培训课件
- 浙江工贸职业技术学院《高等数学Ⅱ》2025-2026学年期末试卷(A卷)
- 闭经中医课件
- 危化品安全管理专项培训
- 急性心肌梗死2025诊疗指南总结
- 小学童诗绘读活动方案
- GB 17051-2025二次供水设施卫生规范
评论
0/150
提交评论