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

news2025/1/12 12:18:32

网管小贾 / sysadm.cc

网管小贾 / sysadm.cc

说来也奇怪,话说不久前我刚刚解决了 VB6 释放资源文件的一个 BUG ,心里正美滋滋的。

不料居然还有个巨大的 BUG 在后边等着我呢!

真是不说不知道,一说吓一跳,十天找 BUG ,N把辛酸泪,在这儿我就写篇文章纪念下这痛苦的过往吧!


使用过 VB6 的小伙伴们应该对资源编辑器和资源文件并不陌生吧,之前我也在文章中有介绍过。

通过添加资源文件的方式,我们可以将一些想要用到的辅助文件给绑定到 EXE 文件中。

比如,我们的程序可能会用到的一些 DLL 动态链接库文件,或者一些图片啥的,那么就可以通过这样的方式把它嵌入到程序中。

到了要用的时候再随时随地将文件释放出来,最终也只需要做成一个 EXE 文件,既方便又干净,绿色环保,还倍有面子。


至于如何添加资源文件,以及如何释放和利用资源文件,这些问题在网上都有很多介绍,内容都挺详细的,在这里我就不多啰嗦了。

既然这么方便好用,我当然也不能放过了,于是我就经常这么用来着。

可是有那么一天,对,就是修复完之前那个释放文件大小不正确的 BUG 后,我突然发现这玩意特么又出问题了,而且还挺大发。

要么无法再添加新的资源文件,要么能添加但重新再打开工程时就会报错,整得我一脸懵啊!

在这里插入图片描述

这个“内存溢出”是个什么鬼?

起初我怀疑是我年老色衰程序哪里给搞坏了,后来对比了我修改的代码部分,发现并不是哪里写坏了,而是资源文件引起的。

这就有点搞笑了,难道添加个资源文件也会导致内存溢出吗?

然而事实证明这是真的!

经过不厌其烦的多次测试,我发现只要添加文件后生成的 RES 资源文件本身大小超过 350 兆就会立马崩溃。

是的,你没看错,就区区 350 兆就玩完了!

反正上不了 400 多兆吧,具体上限我没有找到官方明确的说法。

后来我想了想,猜测可能这玩意只能用来添加一些小文件,如库文件、图标或配置文件等,而并不适合用来装大文件。

可惜可惜,这么好用的东西,就因为其本身古老陈旧带来的限制而导致成了个半废品,说实话,对于有着几十年感情的我有点不太能接受啊!

在查资料的时候,发现有 VB6 生成的 EXE2G 上限的说法,那么这个资源文件好歹也来个 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1471276.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【国产MCU】-CH32V307-定时器同步模式

定时器同步模式 文章目录 定时器同步模式1、定时器同步模式介绍2、驱动API介绍3、定时器同步模式实例1、定时器同步模式介绍 CH32V307的定时器能够输出时钟脉冲(TRGO),也能接收其他定时器的输入(ITRx)。不同的定时器的ITRx的来源(别的定时器的TRGO)是不一样的。 通用定…

Python高性能web框架--Fastapi快速入门

文章目录 fastapi框架一、预备知识点1.1、http协议一、简介二、 http协议特性三、http请求协议与响应协议 1.2、api接口 二、quick start简单案例 fastapi框架 Fastapi&#xff0c;一个用于构建 API 的现代、快速&#xff08;高性能&#xff09;的web框架。 fastapi的两个核心…

单步调试Linux内核论证水位线

哈喽&#xff0c;我是子牙&#xff0c;一个很卷的硬核男人 深入研究计算机底层、Windows内核、Linux内核、Hotspot源码……聚焦做那些大家想学没地方学的课程。为了保证课程质量及教学效果&#xff0c;一年磨一剑&#xff0c;三年先后做了这些课程&#xff1a;手写JVM、手写OS…

Linux安装jdk、tomcat、MySQL离线安装与启动

一、JDK和Tomcat的安装 1.JDK安装 直接上传到Linux服务器的&#xff0c;上传jdk、tomcat安装包 解压JDK安装包 //解压jdk tar -zxvf jdk-8u151-linux-x64.tar.gz 置环境变量(JAVA_HOME和PATH) vim /etc/profile 在文件末尾添加以下内容&#xff1a; //java environment expo…

matlab一维二维和三维RBF插值方法

1、内容简介 略 50-可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 matlab一维二维和三维RBF插值方法_哔哩哔哩_bilibili 4、参考论文 略

【Linux运维系列】vim操作

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

03-Linux权限

root用户 root用户&#xff08;超级管理员&#xff09; 无论是Windows、MacOS、Linux均采用多用的管理模式进行权限管理 在Linux系统中&#xff0c;拥有最大权限的账户名为&#xff1a;root&#xff08;超级管理员&#xff09;刚开始学习的时候&#xff0c;大多时间都是用的…

MySQL 篇-深入了解 DDL 语言(一)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 MySQL 说明 2.0 DDL 语言 2.1 DDL 语言 - 定义数据库 2.1.1 创建数据库操作 2.1.2 查看数据库操作 2.1.3 使用数据库操作 2.1.4 删除数据库操作 2.2 DDL 语言 …

leetcode-hot100-双指针

剪枝&#xff0c;减少不必要的计算 283. 移动零 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 示例 2: 输入: nums [0] 输出: [0] 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 第一印象&#xff1a;使用一个辅助数组&#xff0c;同时以…

蓝桥杯-答疑

原题链接&#xff1a;用户登录 答疑 题目描述 有 n 位同学同时找老师答疑。每位同学都预先估计了自己答疑的时间。 老师可以安排答疑的顺序&#xff0c;同学们要依次进入老师办公室答疑。一位同学答疑的过程如下 1.首先进入办公室&#xff0c;编号为 的同学需要 s&#xff0c;…

卖家横扫海外露营市场的机会来了,赛盈分销预测2024年消费者新需求

甲辰龙年开篇&#xff0c;就要迎来国外野营浪潮了&#xff0c;希望点开这篇推送的你&#xff0c;红红火火、热辣滚烫一整年。每年的3月份&#xff0c;海外用户对露营设备的搜索开始迅速增长。今天和大家聊聊露营市场出海的一些布局方向。 全球露营商品的市场规模愈发壮大&#…

Wireshark过滤DNS协议包语法实战

背景 现网DNS服务器发现CPU突增&#xff0c;发现有可能是客户恶意发起的随机子域名扫描&#xff0c;对服务器进行抓包分析&#xff0c;记录下当时的操作。 抓包 执行命令 tcpdump -iany port 53 and host $ip -nnv -w $ip.pcap进行抓包导出到本地&#xff0c;使用Wireshark进…

网站开发--详解Servlet

&#x1f495;"Echo"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;网站开发–详解Servlet 一.基本介绍 tomcat是Java中开发服务器的重要的一个工具,任何开发的服务器都要部署在tomcat之上,可以说tomcat是所有服务器的底座,为了更好的操作http,to…

网络安全Web Hacking 101笔记,2023年最新整理!

在计算机技术如日中天的今天&#xff0c;Web安全问题也接踵而来。但Web安全却“入门简单精通难”&#xff0c;涉及技术非常多且广&#xff0c;学习阻力很大。 为此今天分享一份94页的《Web Hacking 101》笔记&#xff0c;包含Web安全知识&#xff0c;例如HTML注入、XSS、CSRF、…

MATLAB Function转C代码实战

文章目录 前言1. 准备工作2. 使用MATLAB Coder2.1 确定输入输出的类型2.2 MATLAB Coder过程 3. 代码调整和优化4. 编译和测试5. 性能分析和优化结语 前言 在科学与工程领域&#xff0c;MATLAB&#xff08;Matrix Laboratory&#xff09;是一种广泛使用的高级技术计算软件&…

Spring Boot 接口请求日志(基于AOP和自定义注解)

一、需求 在Spring Boot应用中&#xff0c;实现接口请求日志记录功能&#xff0c;要求能够记录包括请求方法、接口路径及请求参数等核心信息&#xff0c;并提供灵活的开关配置。 二、方案概述 采用AOP&#xff08;面向切面编程&#xff09;结合自定义注解的方式实现。 具体…

1904_ARM Cortex M系列芯片特性小结

1904_ARM Cortex M系列芯片特性小结 全部学习汇总&#xff1a; g_arm_cores: ARM内核的学习笔记 (gitee.com) ARM Cortex M系列的MCU用过好几款了&#xff0c;也涉及到了不同的内核。不过&#xff0c;关于这些内核的基本的特性还是有些不了解。从ARM的官方网站上找来了一个对比…

《游戏引擎架构》 -- 学习4

资源及文件系统 文件系统 游戏引擎的文件系统API通常提供以下功能&#xff1a; 搜需路径&#xff1a;是含一串路径的字符串&#xff0c;各路径之间以特殊字符&#xff08;如冒号或分号&#xff09;分隔&#xff0c;找文件时就会从这些路径进行搜寻。例如在命令行下执行程序&a…

2023年06月CCF-GESP编程能力等级认证Scratch编程一级真题解析

一、单选题&#xff08;共10题&#xff0c;共30分&#xff09; 第1题 以下不属于计算机输出设备的有&#xff08; &#xff09;。 A&#xff1a;麦克风 B&#xff1a;音箱 C&#xff1a;打印机 D&#xff1a;显示器 答案&#xff1a;A 第2题 点击下面哪个图标可以使舞台区…

真香!NineData SQL开发全面适配 GaiaDB

2 月&#xff0c;新年伊始&#xff0c;NineData 重磅发布&#xff0c;提供了对百度云原生关系型数据库 GaiaDB 的支持。 这一次的发布不仅仅是简单的数据源支持&#xff0c;而是覆盖了整个 SQL 开发能力的重要发布&#xff0c;意味着您已经可以完整地使用 NineData SQL 开发的…