c_c++技巧集
源代码在线查看: 有关应用程序的平台版本区别的一点心得.txt
作者:rick1126
email: rickzhang@sina.com
日期:2001-3-14 16:57:00
想必各位也看到了我在论坛上面发出的关于CRgn::GetRegionData的帖子, 最近从公司的一位高手那里很偶然的知道了原因. 就是在函数的头文件里面存在着对于不同OS的版本判定所进行的不同函数处理, 我的那个函数在强制设置为win200模式以后就正常了. 具体的介绍如下(翻译自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 定义.