VC6的几个好帮手
作者:马健
邮箱:stronghorse_mj@hotmail.com
主页:https://www.cnblogs.com/stronghorse
发布:2025.01.08
由于历史原因,我发布的免费软件基本上均以VC6为开发工具,其中仅有一小部分升级到了VC2019,全部升级的成本实在难以承受。所以我也算是VC6的资深用户,正好前段时间有网友问到在学校里用VC6碰到的一些问题,所以就在这里总结一些我个人使用VC6的经验,与各位分享。
我用过VC6和VC2008、2010、2012、2015、2019,与后面几个版本相比,我最喜欢VC6的地方是:
- VC6的资源编辑器在不同projet之间复制资源,比如说对话框或对话框中的控件的时候很方便,在一个project中直接打开另一个project的rc文件即可复制,而VC2019比较折腾:
要么在同一个solution下的project之间进行复制,所以有时候为了复制资源,就只有先添加project,复制完以后再删除。
要么利用VC IDE自身的记忆:先打开需要复制的project,选中需要复制的对话框或控件,然后Ctrl+C,再关闭project,打开需要粘贴的project,点开资源编辑界面,然后Ctrl+V。 - VC6的ClassWizard生成的代码看起来更顺眼一些,尤其是在对话框中多次对消息、变量进行映射后,VC6生成的对话框头文件看起来很正常,VC2019的头文件就是一团乱麻。
- VC6体积小,启动快,开发一些小工具足够了。
至于VC6在现代Windows版本下的安装,我自己试过Win7、Win10都没有问题,这方面上网搜一下就知道了。如果实在搞不定又必须使用VC6,还可以在XP SP3虚拟机里安装VC6,这个正常情况下都不会有什么问题。安装以后建议务必要打VS6 SP6补丁,这是VS6的最后一个补丁包。另外安装VC6时建议选择全部组件,包括Unicode编码支持和CRT、MFC的全部源代码。现代Window都是Unicode内核,但VC6缺省是不安装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有一堆毛病,不折腾一下用起来会不舒服斯基。
(1)MSDN Oct 2001的空白页问题
这个版本的MSDN在XP下安装没事,如果在Win7、Win10下安装,SDK函数Shell_NotifyIcon等共12个页面会显示为空白。好消息是,这12个htm文件全部集中在shellcc.chm这一个文件里,就是简单的脚本语法错误。所以用HugeCHM拆分这个CHM文件,再用UltraEdi32的“文件替换”功能对拆分出来的htm文件进行批量文本替换以修正语法错误,最后重新用HugeCHM打包,覆盖原文件,即可修正所有空白页面。第一次修正这个错误的时候花了我几个小时,但如果再次进行修正,我可以在一分钟之内从头到尾全部搞定,所以真没什么技术含量。
2001年前几个季度的MSDN没有这个问题,包括我手上有的Jan 2001、July 2001,所以如果不想折腾这几个空白页,建议安装Oct之前的版本。
(2)MSDN Oct 2001的3CD版与1DVD版
MSDN Oct 2001提供两个版本,即1DVD版和3CD版,二者在帮助文件的内容上完全一样,也就是说,制作1DVD版的时候,其实就是简单把3CD版的文件全部放到一起,然后修改了光盘中\x86\Setup\msdn.stf文件中的几行,即安装过程中提示换盘的时候需要检查的光盘卷标号。1DVD版把3CD的卷标号都换成自家的卷标号,在安装的时候安装程序在检查点一看要求的卷标号的光盘已经加载,就不再提示换盘,直接读取文件进行安装。
但是在把MSDN Oct 2001安装到硬盘以后,如果安装时没有选择完全安装,而是缺了某些内容,那么在用到这些内容的时候,MSDN就会提示插入光盘以便读取所需的内容。但MSDN只会按照3CD版的盘号进行提示,也只认3CD的光盘,插入1DVD的没用。
所以如果没有折腾的能力或者心情,建议保留、安装3CD版的MSDN Oct 2001,而不是1DVD版。但奇怪的是,现在网上能找到的MSDN Oct 2001资源基本上都是1DVD版,3CD版近乎绝迹,但在本文之前我从来没有看到过任何帖子讨论本文所谈的修复技术,所以我只能认为要么是大家装MSDN的时候都是完全安装,要么是都只把它当做收藏品,而不是生产力工具。
言归正传,安装后MSDN提示要求插入光盘的情况主要有以下两种:
1)搜索过程中发现某些内容没有安装
例如,如果安装时没有勾选最后那项近630MB的“All other files”,则在MSDN主界面的“索引”页签中输入关键字“EDID”,然后点击列表中出现的EDID项,就会提示插入第3张光盘。插入DVD不认账。
解决办法:
- 先对“C:\ProgramData\Application Data\Microsoft\HTML Help\hhcolreg.dat”文件进行备份,然后用文本编辑器打开,准备修改。
- 在这个文件的第23、30、37、44行,把3CD版的卷标号DNQ130ENU1、DNQ130ENU2、DNQ130ENU3全部统一替换成1DVD版的卷标号MSDN_OCT_2001。
- 如果有强迫症,还可以把这4个<Location>段中的TitleString值,从CD1、CD2、CD3改成DVD。
- 存盘,退出,重启MSDN,即可插入DVD打开搜索到的条目。
2)重新运行C盘MSDN安装文件夹下的setup,补充安装以前没有安装的内容
这个时候也会提示插入安装光盘,而且也只会提示、读取3CD光盘,不认1DVD光盘。解决方案同上。只不过需要编辑的文件是
C:\Program
Files (x86)\Microsoft Visual Studio\MSDN\2001OCT\1033\Setup\setup.stf
在第113到116行,把3CD的卷标号全部替换成DVD的卷标号即可。
(3)MSDN Oct 2001中无关内容的清理
与VC6原配的低版本MSDN相比,高版本MSDN有一个无比讨厌的地方:大多数SDK函数都与WinCE的函数重名,所以查帮助的时候,经常会跳出对话框,让选择是查看WinCE还是查看Windows SDK,很不爽利。解决的办法也很简单:
- 在MSDN的安装文件夹,找到并备份文件:
C:\Program Files (x86)\Microsoft Visual Studio\MSDN\2001OCT\1033\MSDN130.COL -
用普通文本编辑器或专门的XML编辑器,打开这个文件,可以看出这是一个标准XML文件,<Folders>下面的各个<Folder>段,与MSDN主界面“目录”页签中的树状目录相对应。手工删除整个Embedded
Developer Documentation大段,即从
<TitleString value="Embedded Developer Documentation"/>
前面的<Folder>,一直删到
<TitleString value="Platform SDK Documentation"/>
前面的</Folder>。 - 存盘,退出。
- 重新启动MSDN,提示需要等待重新建立索引,建立好以后再查询SDK函数,就不会再跳出对话框让选择WinCE。
MSDN Oct 2001中提供对Windows XP的开发说明,但是XP中的函数直接在VC6中调用,会出现“未定义”的错误,对此可以采用的解决方法包括:
- 手工在StdAfx.h的开始处加上:
#define WINVER 0x0500
#define _WIN32_WINNT 0x0500
#define _WIN32_IE 0x0500
即强制指定编译后的目标EXE只能在Windows 2000、IE5及其以上的平台中运行。VS6中其实已经包含了部分Windows 2000 SDK,但是因为VC6自动生成的StdAfx.h中没有对_WIN32_WINNT进行定义,所以限制了只能使用Win98 SDK。不信可以在安装文件夹的VC98\Include\WINBASE.H文件中搜索_WIN32_WINNT,在VC98\Include\COMMCTRL.H中搜索_WIN32_IE,就可以看到一堆的条件编译。 - 如果要求使用Windows XP、2003(XP的服务器版)中的更多SDK函数,可以安装Windows Platform SDK(PSDK)。能够与VC6匹配的最高一版是Windows Server 2003 PSDK February 2003,网上有下载地址、安装和配置方法。安装后在VC中就能直接调用全部Windows 2003的SDK函数。
- 如果要求调用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更好,还有如下好处:
- 支持OpenMP,VC要到VC2008才支持。不过按照Intel的说明,OpenMP只能使用动态库,不能使用静态库,我猜是可能引发线程风暴。
- 对语法检查更严格,有些用原版VC6编译时没有暴露出来的错误,用ICC编译就可能暴露出来。
- 据说经过编译选项优化后,编译出来的目标代码更快,毕竟CPU就是它自家产的,编译器支持的指令集比VC6更丰富。不过我没有做过严格的benchmark测试,所以只能是“据说”。
三、Visual Assist + WndTabs
VC6 IDE最被人诟病的地方就是太过古老,没有一些现在已经习以为常的功能,包括语法分色、自动完成、窗口分组等。安装了以上两个辅助软件以后,你会发现你的VC6 IDE有了质的变化。
我最喜欢Visual Assist的功能其实是它的Go功能,通过工具条上的下拉框可以快速定位CPP文件中的函数,插入光标在某个CRT或MFC函数上时,点击工具条上的Go按钮就可以跳转到这个函数的源代码(前提是安装VC6时选择安装了CRT和MFC的源代码),方便查看。
四、图标(icon)工具
用户看软件的第一眼,通常看到的是软件的图标,所以说“图标是软件的脸面”。但遗憾的是,VC6的图标编辑器只能创建、编辑256色的图标,这与现在流行的32位色图标有点差距。而且VC6自动生成的缺省图标只有32×32的像素尺寸,基本上只适用于Win 98/me/2000/XP,从Win7开始,资源管理器的“中等图标”就要求48×48,“大图标”、“超大图标”则要求256×256(理论上说“大图标”要求的是128×128像素的图标,但实际上如果你的图标最大尺寸只有128×128,在“大图标”下会被按照48×48的图标显示,必须要达到256×256,才能在“大图标”下满尺寸显示,所以128×128像素图标就是典型的“然并卵”)。
与图标编辑器不同的是,VC6的编译器对图标色彩没啥限制,支持对32位色的图标进行编译。所以只要能搞到合适的图标,对VC6自动生成的图标文件进行覆盖,就可以给自己的软件换上一个漂亮的图标,我自己就用过不少256×256像素的32位色图标。
图标的来源一般可以有以下几种:
- 直接找图标资源网站,下载成品图标文件。这种网站一般变化比较大,要么开着开着莫名其妙就倒了,要么免费做好了就变收费了,所以网址没有什么收藏、推荐的价值,需要的时候现搜就好。
- 从其他软件提取。如果是从单个EXE或DLL文件里提取资源,用VC自己的资源编辑器即可,如果是批量提取,可以使用nirsoft公司出品的ResourcesExtract,或者其他类似的工具,一家伙就把整个C盘下的所有图标都扫出来。
顺便说一句,我自己也开发过自用的资源扫描、抓取工具,结果开发完成后一看,大量的核心代码其实来自Windows源代码,不然根本搞不定。举一个简单的例子:如何把本EXE实例中的图标资源抽取出来,另存为ico文件?这个问题大名鼎鼎的CxImage都没有搞定,在demo中只能走偷奸耍滑的路线。 - AI生成。我试过豆包,效果还不错,虽然不能直接生成最终的成品,但稍微改一下就能用。
- 自己编辑。以上几个来源都有撞车的风险,有些可能还有法律风险,所以更保险的办法是自己用图标编辑器自己做,可以在现成的图标或图像的基础上进行修改,也可以把几个图标拼凑成一个图标。我常用的图标编辑软件是AWicons Pro和IconWorkshop,这两个软件各有各的特点,需要配合使用:AWicons不能创建128×128以上尺寸的图标,但IconWorkshop可以;而IconWorkshop不能调整图标文件中子图标的顺序,但AWicons可以——VC6的编译器虽然可以编译各种色彩空间和尺寸的图标,但对图标文件中子图标的排列顺序有要求,顺序不对就报错给你看,高版本VC则没有这种限制。
如果想减小图标文件的长度,通常在图标文件中包含256×256、48×48像素尺寸的就好,甚至只有其中一个也可以。如果实在想兼容老系统,还可以包含32×32、16×16,别的都是然并卵。
五、Windows 源代码
这个不是必选项,但绝对是加分项。很多时候做Windows桌面软件开发,看帮助看得莫名其妙,只能追到最底层的Windows源代码里去一看究竟,这就是Linux作者Linus常说的“Talk is cheap, show me the code ”。另外多读一些高水平的源代码,也有助于增长见识,尤其是了解Windows的一些undocumented的事情。我的好几个软件,其实就是基于读Windows源代码的收获,如上面提到的资源扫描、抓取工具。
历史上Windows源代码曾经多次被泄露,最早是Windows 2000的,然后是XP、2003的,天知道什么时候就轮到Win7、Win10、Win11的(几年前很多网上新闻就说Win10源代码遭到泄露,但实际看过泄露出来的压缩文件就知道,it's a fake news!)。从代码组织上看,Win 2000的源代码组织略显混乱,不如XP、2003的组织得清晰有条理,而XP作为客户端,代码量比服务器端的2003要多一些,所以在有需要时我习惯上都是先查XP的源代码,查不到再查2003的源代码。
开源项目wine号称是Windows的平替,但是实际读过二者的源代码以后就会发现,双方的差距不是一星半点儿,所以很多Windows桌面端软件在wine下出现各种兼容性问题完全不值得奇怪。另外VC 2019通过单步跟踪,也可以进入部分Win7等高版本Windows API函数的源代码,但VC6完全没有这种好事,所以如果能下载完全的Windows源代码,还是尽量去下载一份备查。

浙公网安备 33010602011771号