作者:马健
邮箱:stronghorse_mj@hotmail.com
主页:https://www.cnblogs.com/stronghorse
发布:2025.01.08
由于历史原因,我发布的免费软件基本上均以VC6为开发工具,其中仅有一小部分升级到了VC2019,全部升级的成本实在难以承受。所以我也算是VC6的资深用户,正好前段时间有网友问到在学校里用VC6碰到的一些问题,所以就在这里总结一些我个人使用VC6的经验,与各位分享。
我用过VC6和VC2008、2010、2012、2015、2019,与后面几个版本相比,我最喜欢VC6的地方是:
1、条件断点。在VC6中下断点以后,可以设定断点条件,只有在断点条件成立时才会触发断点。比如说在循环体内下断点,可以设置循环变量达到多少时才触发断点。这个功能在后面的VC版本中被取消了,带来很大的麻烦。我在VC6中抓内存泄露(memory leak)就全靠这个功能。
2、在VC6的Class Wizzard功能中把对话框控件映射成变量时,变量类型是从下拉列表框中选择,而不是像后续的版本那样就提供一个光溜溜的编辑框,纯让用户手输。这个功能对初级用户特别重要,因为刚开始谁知道能映射成哪些类型的变量?就算是老用户,有时候凭空手输也会觉得没底,不如从列表框选择那么踏实。
至于VC6在现代Windows版本下的安装,我自己试过Win7、Win10都没有问题,这方面上网搜一下就知道了。如果实在搞不定又必须使用VC6,还可以在XP SP3虚拟机里安装VC6,这个正常情况下都不会有什么问题。安装以后建议务必要打VS6 SP6补丁,这是VS6的最后一个补丁包。另外安装VC6时建议选择全部组件,包括Unicode编码支持和CRT、MFC的全部源代码。现代Window都是Unicode内核,有源代码则给跟踪调试带来极大的方便,顺便还可以学点高水平的源代码。
不过原版VC6毕竟比较老,总有这样那样的不便,但配合下面介绍的几个好帮手以后,以我的经验看会更好用一点。
一、MSDN Library和Windows SDK
MSDN Libray(一般习惯简称“MSDN”)是VC6的帮助文件,所以安装VC6而不装这个是不可想象的。原版VS6 Proffesional的6张安装光盘中,有两张就是MSDN。不过这个VC6专用版的MSDN是独立发行的1998年第2季度MSDN,即MSDN April 1998的子集,对Windows SDK的说明有点老。所以现在一般都不装VC6自带的MSDN,而是选择单独安装MSDN。
能够与VC6适配的最后一版MSDN是2001年第4季度的版本,即MSDN October 2001。这个时候差不多是Windows XP发行的时候,所以这个版本的MSDN里有XP SDK的说明。不过坏消息是,这个版本的MSDN在XP下安装没事,如果在Win7、Win10下安装,SDK函数Shell_NotifyIcon等共12个页面会显示为空白。而好消息是,这12个htm文件全部集中在shellcc.chm这一个文件里,就是简单的脚本语法错误。所以用HugeCHM拆分这个CHM文件,再用UltraEdi32的“文件替换”功能对拆分出来的htm文件进行批量文本替换以修正语法错误,最后重新用HugeCHM打包,覆盖原文件,即可修正所有空白页面。第一次修正这个错误的时候花了我几个小时,但如果再次进行修正,我可以在一分钟之内从头到尾全部搞定,所以真没什么技术含量。
MSDN Oct 2001中提供对Windows XP的开发说明,但是XP中的函数直接在VC6中调用,会出现“未定义”的错误,对此可以采用的解决方法包括:
1、手工在StdAfx.h的开始处加上一行:
#define _WIN32_WINNT 0x0500
即强制指定编译后的目标EXE只能在Windows 2000及其以上的平台中运行。VS6中其实已经包含了部分Windows 2000 SDK,但是因为VC6自动生成的StdAfx.h中没有对_WIN32_WINNT进行定义,所以限制了只能使用Win98 SDK。不信可以在安装文件夹的VC98\Include\WINBASE.H文件中搜索_WIN32_WINNT,就可以看到一堆的条件编译。
2、如果要求使用Windows XP、2003(XP的服务器版)中的SDK函数,可以安装Windows Platform SDK(PSDK)。能够与VC6匹配的最高一版是Windows Server 2003 PSDK February 2003,网上有下载地址、安装和配置方法。安装后在VC中就能直接调用全部Windows 2003的SDK函数。
3、如果要求调用Win7、Win10下的SDK函数,就只能用LoadLibrary、GetProcAddress手工加载了。
二、Intel C Plus Plus Compiler
VC6是1998年发布的,对于C99标准仅为部分支持,造成的结果就是在编译采用STL的代码时,经常出错。如果不想放弃VC6,当又想好好用STL,解决办法之一就是安装与VC6 IDE兼容的第三方编译器。
我习惯使用的第三方编译器是Intel C Plus Plus Compiler(ICC),与VC6兼容的最高一个版本是v10.1.020。在安装VC6之后再安装ICC,可以在VC6的IDE里用选项勾选启用或停用ICC。如果启用,则C++编译器自动换成ICC,编译输出还在VC6 IDE的Output窗口里,停用后则与原来的VC6一样。
我自己的体会,ICC除了对STL的支持比VC6更好,还有如下好处:
1、支持OpenMP,VC要到VC2008才支持。不过按照Intel的说明,OpenMP只能使用动态库,不能使用静态库,我猜是可能引发线程风暴。
2、对语法检查更严格,有些用原版VC6编译时没有暴露出来的错误,用ICC编译就可能暴露出来。
3、据说经过编译选项优化后,编译出来的目标代码更快,毕竟CPU就是它自家产的,编译器支持的指令集比VC6更丰富。不过我没有做过严格的benchmark测试,所以只能是“据说”。
三、Visual Assist + WndTabs
VC6 IDE最被人诟病的地方就是太过古老,没有一些现在已经习以为常的功能,包括语法分色、自动完成、窗口分组等。安装了以上两个辅助软件以后,你会发现你的VC6 IDE有了质的变化。
我最喜欢Visual Assist的功能其实是它的Go功能,通过工具条上的下拉框可以快速定位CPP文件中的函数,插入光标在某个CRT或MFC函数上时,点击工具条上的Go按钮就可以跳转到这个函数的源代码(前提是安装VC6时选择安装了CRT和MFC的源代码),方便查看。
四、Windows 源代码
这个不是必选项,但绝对是加分项。很多时候做Windows桌面软件开发,看帮助看得莫名其妙,只能追到最底层的Windows源代码里去一看究竟,这就是Linux作者Linus常说的“Talk is cheap, show me the code ”。另外多读一些高水平的源代码,也有助于增长见识,尤其是了解Windows的一些undocumented的事情。我的好几个软件,其实就是基于读Windows源代码的收获。
历史上Windows源代码曾经多次被泄露,最早是Windows 2000的,然后是XP、2003的,天知道什么时候就轮到Win7、Win10、Win11的。从代码组织上看,Win 2000的源代码组织略显混乱,不如XP、2003的组织得清晰有条理,而且代码这种事情一般是喜新厌旧,所以在有需要时我习惯上都是先查2003的源代码。
开源项目wine号称是Windows的平替,但是实际读过二者的源代码以后就会发现,双方的差距不是一星半点儿,所以很多Windows桌面端软件在wine下出现各种兼容性问题完全不值得奇怪。另外VC 2019通过单步跟踪,也可以进入部分Win7等高版本Windows的源代码,但VC6完全没有这种好事,所以如果能下载完全的Windows源代码,还是尽量去下载一份备查。