说来也奇怪,话说不久前我刚刚解决了 VB6
释放资源文件的一个 BUG
,心里正美滋滋的。
不料居然还有个巨大的 BUG
在后边等着我呢!
真是不说不知道,一说吓一跳,十天找 BUG
,N把辛酸泪,在这儿我就写篇文章纪念下这痛苦的过往吧!
使用过 VB6
的小伙伴们应该对资源编辑器和资源文件并不陌生吧,之前我也在文章中有介绍过。
通过添加资源文件的方式,我们可以将一些想要用到的辅助文件给绑定到 EXE
文件中。
比如,我们的程序可能会用到的一些 DLL
动态链接库文件,或者一些图片啥的,那么就可以通过这样的方式把它嵌入到程序中。
到了要用的时候再随时随地将文件释放出来,最终也只需要做成一个 EXE
文件,既方便又干净,绿色环保,还倍有面子。
至于如何添加资源文件,以及如何释放和利用资源文件,这些问题在网上都有很多介绍,内容都挺详细的,在这里我就不多啰嗦了。
既然这么方便好用,我当然也不能放过了,于是我就经常这么用来着。
可是有那么一天,对,就是修复完之前那个释放文件大小不正确的 BUG
后,我突然发现这玩意特么又出问题了,而且还挺大发。
要么无法再添加新的资源文件,要么能添加但重新再打开工程时就会报错,整得我一脸懵啊!
这个“内存溢出”是个什么鬼?
起初我怀疑是我年老色衰程序哪里给搞坏了,后来对比了我修改的代码部分,发现并不是哪里写坏了,而是资源文件引起的。
这就有点搞笑了,难道添加个资源文件也会导致内存溢出吗?
然而事实证明这是真的!
经过不厌其烦的多次测试,我发现只要添加文件后生成的 RES
资源文件本身大小超过 350
兆就会立马崩溃。
是的,你没看错,就区区 350
兆就玩完了!
反正上不了 400
多兆吧,具体上限我没有找到官方明确的说法。
后来我想了想,猜测可能这玩意只能用来添加一些小文件,如库文件、图标或配置文件等,而并不适合用来装大文件。
可惜可惜,这么好用的东西,就因为其本身古老陈旧带来的限制而导致成了个半废品,说实话,对于有着几十年感情的我有点不太能接受啊!
在查资料的时候,发现有 VB6
生成的 EXE
有 2G
上限的说法,那么这个资源文件好歹也来个 2G
上限也行啊,结果却是那么的悲哀,可用大小才这么一点!
好了,就因为这点问题让我放弃 VB6
,我做不到。
擦干眼泪,继续前行,谁麻烦递个手巾板!
既然此路不通,那我就只能另辟蹊径了,活人还能让尿给憋死?
前一阵正好要做个程序,需要绑定较大资源文件到程序中,大小也要在数百兆左右,得,就拿这个来测试吧!
可常规方式行不通,问题又摆在那儿,还能有什么好办法呢?
后来我找了很多资料,思来想去,只有一个简单得不能再简单,但又有点麻烦的做法:手动将资源文件绑定到 EXE
文件中。
什么?什么?你把话说清楚!
咳咳……静一静,请听我说……
首先,我们先制作一个不带任何资源文件的 EXE
程序文件,它具有除了资源文件之外所有你希望要实现的功能,包括释放资源文件的功能。
其次,将需要的资源文件像嫁接手术一样把它们连接到 EXE
文件后面,有一个接一个,有两个就接两个,一个挨着一个按顺序放到 EXE
文件尾部,然后生成一个新的更大的 EXE
文件。
最后,当需要释放或使用资源文件时,再正常执行程序将其从尾部读取即可。
说到这儿可能有经验的小伙伴会说,这不是病毒原理嘛!
没错,早期的病毒就是这么干的,在正常程序屁股后边加一段代码。
当被感染的程序执行到最后时,它并没有结束,而是魔术般地继续执行后面的病毒代码。
因此早期杀毒基本上总是要先判断正常文件大小是否有变化,如果变大了,那么大概率就是中毒了。
尾部接上一些令人迷惑的东西并不会导致 EXE
文件无法执行,因此这是完全可行的,并且目前看并没有文件大小的限制。
当然了,这么做并不表示程序会变成病毒,两者没有必然关联。
总之原理就是这么个原理,只是按这个原理来实现绑定资源文件突破大小限制罢了。
好,原理大概知道了,具体怎么做呢?
实际做起来的确有点麻烦,特别是资源文件的定位和寻址。
最后我自己做了一个简单的演示示例程序,分为两个部分。
XJAddResToEXE
- 将资源文件绑定到原始EXE
文件尾部的工具程序XJExampleEXE
- 原始示例EXE
文件(绑定资源之前)
网管小贾的自定义输出资源文件演示程序.7z
下载链接:https://www.123pan.com/s/bI7Mjv-q8AH3.html
提取码:
★扫码关注公众号, 发送【001088】获取阅读密码
我来说一下这个示例程序怎么用。
首先,准备好一个未绑定资源文件前的 EXE
文件,示例中我们就用 XJExampleEXE
吧。
注意这个 EXE
中是提前写有释放资源文件代码的。
其次,打开 XJAddResToEXE
,指定好你想要绑定的资源文件(本示例只演示添加一个资源文件的情况)。
导出文件则写上 XJExampleEXE
的同名文件,即生成新的 EXE
文件也是一样名字的。
如果你想生成不同名称的新的 EXE
文件,那么需要修改代码(源代码提供付费下载)。
我们可以对比一下绑定资源前后的两个 EXE
文件,明显后者比较胖一点哈,容量差不多增加的就是资源文件的大小。
最后,打开新生成的 XJExampleEXE
文件,指定好释放路径和文件名,点击按钮即可看到导出的资源文件。
如果你不放心,完全可以将释放出来的资源文件拿过来对比一下。
别光看大小,最好看一看哈希值,基本上就不会错了。
大家可以通过演示程序来体验手动绑定资源文件的感觉,当然目前只支持绑定一个文件。
其实严格来说应该是演示程序只支持释放一个资源文件,因为我给它设定的是只能定位寻址一个文件,因此只能给它绑定一个而不是多个。
不过如果你想要批量绑定多个文件,而且还能做到正常释放,那么就请参考源代码吧!
(当然其中还有一些代码编写上的注意事项和细节内容,有利于更好地实现。)
网管小贾的自定义输出资源文件源代码.7z
下载链接:<付费资源>
★扫码关注公众号, 发送【001088】获取阅读密码
将技术融入生活,打造有趣之故事
网管小贾 / sysadm.cc