你居然告诉我VB6释放资源文件有BUG,官方都没得办法修复,还好我最后搞定了!

网管小贾 / sysadm.cc

网管小贾 / sysadm.cc

告诉大家一个坏消息,我又遇到了问题。

再告诉大家一个好消息,我把问题给解决了!

哈哈,没错,前不久我遇到了一个奇葩问题,头毛都快掉完了,现在很怕别人对我说“谢”字!


凡是撸过代码的小伙伴们一定知道,有一种将第三方文件打包到当前程序的方法。

这种方法可以使得在需要的时候将之前打包好的文件释放出来,然后再加以利用。

这样做的好处有很多,比如可以用来制作单一绿色程序,不用拖泥带水跟着一堆文件,用时就拿出来,不用时再收回去,方便异常。

而在这种方法中,被打包进程序的第三方文件就被称作为资源文件。

而资源文件是通过资源编辑器等方式打包绑定到当前程序中的。


说到这儿,那么具体的这个资源文件是怎么打包进来的呢?

最简单的做法就是利用资源编辑器了。

你看哈,比如打开 VB6IDE ,就可以看到有这么一个小图标,那就是传说中的资源编辑器了。

在这里插入图片描述

打开看看?

好,打开了,可以看到上边工具栏里靠右边有一排小图标。

它们分别是字符串、光标、图标、位图,还有自定义资源,就是这么样来添加不同的资源文件的。

通常我用的最多的就是自定义资源了,因为这玩意是万能的啊,啥格式类型的文件都能整,万金油一枚啊!

在这里插入图片描述

只要轻轻点它一下,它立马问你要添加哪个漂亮的倒霉蛋。

在这里插入图片描述

只要你说话,好咧,就是它了,它就乖乖地进来,成了当前程序的一部分了。

在这里插入图片描述

不过嘛进来才发现,好像有点不太人性化哈,每进来一位都用编号表示,类型名称一律为 CUSTOM ,整得跟太平天国一个尿性。

光看编号不看脸,这叫天王我咋记得住谁和谁,到了晚上怎么翻牌子?

其实可以通过修改属性把类型给改了,类型可以叫任何的名字,CUSTOM 就是一种类型。

当然在调用的时候要注意可别写错了。

最后该进来的都进来了,保存资源文件,后缀名就是 RES

在这里插入图片描述

别看多了一个 RES 的资源文件,在编译生成 EXE 文件后是不需要它的,它的作用就是将之前添加的文件都打包进 EXE 文件。

利用资源编辑器挺方便的,不过还有一种通过命令行调用 RC 程序来制作的方法。

只要安装了 VB6.0 编程环境,就可以很容易地找到一个程序命令:rc.exe

C:\Program Files (x86)\Microsoft Visual Studio\VB98\RC.exe

在这里插入图片描述

这玩意就是用来制作 RES 资源文件的,当然不仅是 VB ,像 VC++ 之类的也大概其是这么玩的。

简单地说,打开记事本,输入以下代码,单词之间用 TAB 或空格分隔。

101	CUSTOM	FOO1.DLL
102	CUSTOM	FOO2.DLL

然后将其以 rc 为扩展名保存到需要打包文件所在的文件夹内。

比如保存为 1.rc ,然后将它和 FOO1.DLLFOO2.DLL 两个文件放到一起,再加上个参数 /r 执行打包命令。

rc /r 1.rc

如果没放到一起,它就会找不到打包目标对象。

在这里插入图片描述

正常情况下就不会报错。

在这里插入图片描述

一旦成功,会在文件夹内生成一个 RES 资源文件,这和资源编辑器的效果是一样一样的。

在这里插入图片描述

接下来添加这个资源文件也是小事一桩。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

哎,啰嗦了这么多,可能有的小伙伴想要打哈欠退场了。

抱歉,现在重点来了!

按理说资源文件添加没问题,只要用的时候调用就行了,对吧?

可偏偏事与愿违,有时调用并不顺利,甚至频频出错,让人抓狂!


大家请看,如下是通常释放资源文件的代码,简言之就是利用了写二进制文件的办法。

intFreeFile = FreeFile
Open strResFile For Binary As #intFreeFile
Put #intFreeFile, , arr
Close #intFreeFile

然而这里却暗藏着一个惊天的大 BUG

代码本身没啥问题,可是当你在查看释放后资源文件的大小时,它居然……不……正……确!!

怎么不正确?

它会多出几个字节!


有些情况下,文件多几个字节无伤大雅,并不影响使用。

但是有的文件就不能出现这种情况,这样会导致程序无法运行,甚至是崩溃!

后来我这么一查,这释放资源文件大小不正确的问题,我去,还真是 VB6 的一个 BUG


据说在 SP6 时已被修复,这个 BUG 所呈现的现象是,它会在释放出来的文件屁股后边随机加上 1 个到 3 个空字节 vbNullChar

你看看,你看看,它喵地还是随机的,这还怎么玩!

为啥会这样,大神给出了解释,可能是由于 DWord 对齐。


至于这个所谓的 Dword 对齐到底是什么东东又到底发生了什么,作为小白一枚啥都不是的我连问都不敢问。

或许是为了确保某些文件格式的正确性吧,比如 HTML/XML 类型的文件。

因而像这类文件的尾部,如果混入了 vbNullChar ,那么可能就没办法正确读取了。

在这里插入图片描述

其中官方说到 SP6 已修复此 BUG ,我呵呵,这纯属大虾扯蛋,大神在后来的帖子中也验证了这个荒谬的说法。

按官方文档所说,VB6.exe6.0.91.15VBA6.dll6.0.0.8965 版本以上就算修复了。

在这里插入图片描述

放P都不带眨巴眼儿的,我都测试过,根本就没有修复嘛!

如下图,我使用的版本肯定是高于官方文档所述的版本。

在这里插入图片描述
在这里插入图片描述

可结果还是出现了释放文件大小不正确的问题,也别怪我一顿输出。

其实这个问题现象吧,严格来说应该是在编译前(即 IDE 环境下),输出文件的大小是正确的。

而在编译后,也就是生成了 EXE 文件后,输出文件的大小就有了偏差。


那位说,是不是你添加资源的姿势不对?

哎,起初我还真怀疑过!

不过就像前文介绍的那样,不管我用什么方法添加的资源文件,都有这个 BUG 存在。

结论也反向验证了这个 BUG 和添加方式没有关系,毕竟问题只在编译后的 EXE 文件中才出现。

看来看去,期待官方来修复这个 BUG 已然是不太可能了,毕竟都已经2024年了!

怎么办?


伟大的领袖毛主席教导我们:独立自主,自力更生,艰苦奋斗!

人总是要有点自主精神的,遇到困难不要被轻易吓倒,要就地躺下,吃饱喝足休息一会儿再起来想办法。

时间紧任务重,我可没说躺平哈,我只是躺了71小时59分60秒。

好,骂也骂了,歇也歇了,开始干活!


既然 BUG 客观存在,那么我们就另辟蹊径,在释放文件时手动修复不就欧了呗!

方法原理也不难理解,只要知道文件的原始大小,在释放文件时控制它以正确大小写入输出即可。

在这里插入图片描述

网管小贾的释放资源文件大小修正示例程序源代码

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

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


相比较之下,这个方法比网上大神说的办法更容易操作,也更简单,不用额外加入配置或其他什么设定,一切都在程序内搞定。

小伙伴们也可以找来自己的文件放进去试一试。

别看广告,看疗效,最后只要确认文件大小,以及哈希值即可验证正确性!


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

网管小贾 / sysadm.cc

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解TCP网络协议(3)

目录 1.前言 2.流量控制 2.阻塞控制 3.延时应答 4.捎带应答 5.面向字节流 6.缓冲区 7.粘包问题 8.TCP异常情况 9.小结 1.前言 在前面的博客中,我们重点介绍了TCP协议的一些属性,有连接属性的三次握手和四次挥手,还有保证数据安全的重传机制和确认应答,还有为了提高效率…

AJ-Report 【开源的一个BI平台】

AJ-Report是全开源的一个BI平台&#xff0c;酷炫大屏展示&#xff0c;能随时随地掌控业务动态&#xff0c;让每个决策都有数据支撑。     多数据源支持&#xff0c;内置mysql、elasticsearch、kudu驱动&#xff0c;支持自定义数据集省去数据接口开发&#xff0c;目前已支持30…

Python 连接 mysql 详解(mysql-connector-python)

文章目录 1 概述1.1 第三方库&#xff1a;mysql-connector-python1.2 可视化工具&#xff1a;navicat1.3 创建测试数据库 2 连接 mysql 数据库2.1 创建一个连接2.2 捕获连接异常2.3 从配置文件中获取连接信息 3 执行 sql 语句3.1 插入、更新、删除3.2 查询 1 概述 1.1 第三方库…

作为一个27岁的人,学习单片机然后进入这行的可能性大吗?

作为一个27岁的人&#xff0c;学习单片机然后进入这行的可能性大吗&#xff1f;有c语言基础。&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「c语言的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“…

Spring Web URL 解析常见错误

上一章节我们讲解了各式各样的错误案例&#xff0c;这些案例都是围绕 Spring 的核心功能展开的&#xff0c;例如依赖注入、AOP 等诸多方面。然而&#xff0c;从现实情况来看&#xff0c;在使用上&#xff0c;我们更多地是使用 Spring 来构建一个 Web 服务&#xff0c;所以从这节…

缩略图保持加密(TPE)论文

文献: R.Zhao,Y.Zhang,Y.Nan,W.Wen,X.Chai,andR. Lan, “Primitively visually meaningful image encryption: A new paradigm,” Inf. Sci. (Ny), Vol. 613, pp. 628–48, 2022. DOI: 10.1016/j.ins.2022.08.027. (1) 第1行:原始图像 第2行:加密图像 加密的目标: 原始…

Verilog实现2进制码与BCD码的互相转换

1、什么是BCD码&#xff1f; BCD码是一种2进制的数字编码形式&#xff0c;用4位2进制数来表示1位10进制中的0~9这10个数。这种编码技术&#xff0c;最常用于会计系统的设计里&#xff0c;因为会计制度经常需要对很长的数字做准确的计算。相对于一般的浮点式记数法&#xff0c;…

【科普】宝宝能听到声音,听力就是正常的吗?

1、什么是新生儿听力筛查 新生儿听力筛查就是用快速而简便精确的方法从新生儿人群中间鉴别出可能存在听力障碍的个体的过程。 2、为什么要做听力筛查&#xff1f; 听力障碍又被称为“看不见的残疾”&#xff0c;是常见的出生缺陷&#xff0c;发生率在0.1%~0.3%,。我国最新统计&…

财务数据处理问题及解决方案分享

一、平台介绍 财务自营计费主要承接京东自营数据在整个供应链中由C端转B端的功能实现&#xff0c;在整个供应链中属于靠后的阶段了&#xff0c;系统主要功能是计费和向B端的汇总。 二、问题描述 近年来自营计费数据量大增&#xff0c;有百亿的数据量&#xff0c;一天中汇总占…

进程和线程的区别详解

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f4d5;格言&#xff1a;那些在暗处执拗生长的花&#xff0c;终有一日会馥郁传香欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 进程 进程在系统中是如何管理的 进一步认识PCB 线程 能否一直增加线程数目来提高效率 进程和线程…

npm 上传一个自己的应用(2) 创建一个JavaScript函数 并发布到NPM

上文 npm 上传一个自己的应用(1) 搭建一个项目环境 带着大家创建了一个项目环境 我们打开 看json的配置 我们入口是一个叫 index.js 的文件 那么 我们就要把它创建出来 之后 我们的方法也就要写在这里面 和 json同一个目录 创建 index.js 我们这里 写个简单的求和操作 index…

Spring Boot 整合 Redis 使用教程

作为开发者&#xff0c;相信大家都知道 Redis 的重要性。Redis 是使用 C 语言开发的一个高性能键值对数据库&#xff0c;是互联网技术领域使用最为广泛的存储中间件&#xff0c;它是「Remote Dictionary Service」的首字母缩写&#xff0c;也就是「远程字典服务」。 Redis 以超…