资源在WindowsGUI的程序中随处可见,这也是微软为了方便把界面和逻辑分开的优秀策略。所谓的资源就是一些用于描述界面或其他特征的说明性字符,它们有固定的格式。这点与HTML有相似之处。而微软提供了处理这些资源描述字符的函数,并上升到Win32API的高度。资源有两种存在形式,一是编译之前,此时的资源被存放到.rc文件(此文件为纯文本文件)中,在程序编译的时候,资源编译器rc.exe把.rc文件编译为.res二进制文件,然后链接器把.res文件和.obj文件链接在一起,并作为资源节存在于生成的.exe文件中。
对于.rc文件,相信很多程序员都很熟悉了,可以直接用文本编辑器编辑。为了可视化设计,微软和其他第三方软件厂商还提供了可视化编辑工具,称之为资源编辑器。VS带的资源编辑器,相信大家都不会陌生。
对于.res文件或者是.exe文件中的资源节的格式,大多数程序员就望而却步了。详细介绍.exe文件结构的资料也不多,能够说清楚资源节格式的资料就更少了。微软提供了FindResource(), LoadResource(), LockResource(), UpdateResource()等函数供用户查看修改二进制资源节里的资源。但是具体的用法解释的并不清楚,网上的例子也很少。但是这方便有做的功能很晚上的软件,如eXeScope,不仅可以查看二进制资源,还可以修改之,可惜没有公开源代码。由于项目需要,这几天一直找相关的例子,发现象Dialog,ICON等资源的处理有很多成功的例子,但是对于看似简单的字符串资源的处理却几乎无一成功的!!!就连老外也一样!!!于是乎,疯狂找资料,终于找到一位明白人写的文章,还有源代码,只是有两点可惜:一是作者是老外,国内程序员不一定都喜欢英语;二是程序源码采用VB编写,这让C/C++的程序源很不舒服。于是乎,对这篇文章关于字符串资源的处理的部分进行研究并重新用C/C++实现的想法涌上心头。由于我对于VB也不是很熟悉,转换语言的过程也不太顺利,不过总算是成功转成了C/C++。技术不敢独享,愿为大家献上,不当之处还请见谅!
1 字符串资源的存放格式与处理单位
不想其他资源,字符串是不能单独处理的,像UpdateResource()等函数要求的最小处理单位是“串组”,这是由字符串资源的存放方式决定的。每16个字符串为一个串组,字符串的排序以字符串的资源ID号为依据,0-15为第一串组,16-31位第二串组,32-47位第三串组,...。串组ID号从1开始,字符串ID号从0</