VB6添加资源文件总是内存溢出?最终我还是治好了这胎里病!

玩网络的小贾 2024-03-04 13:27:25

网管小贾 / sysadm.cc

说来也奇怪,话说不久前我刚刚解决了 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

下载链接:https://www.123pan.com/s/bI7Mjv-68AH3.html

提取码:<关注公众号,发送001088>

(当然其中还有一些代码编写上的注意事项和细节内容,有利于更好地实现。)

将技术融入生活,打造有趣之故事

网管小贾 / sysadm.cc

0 阅读:0

玩网络的小贾

简介:感谢大家的关注