创建自解压可执行文件






4.97/5 (20投票s)
一个允许您创建自解压可执行文件的类,用于分发或设置程序
引言
这个类允许您创建自解压可执行文件,用于分发或安装程序。 很多人在我制作这个类的过程中帮助了我,我想感谢其中的几位。
- Levente Farkas - 感谢他提出该类如何实现的建议
- Roger Allen - 感谢他提供有关数据读取和写入的进一步建议
- Jamie Thornback - 感谢他提供回调程序的帮助
- Tim Johnson - 感谢他的 CShellFileOp 类,这个类在这个类中被简要地使用
这个类的一个新增加的功能是 Zlib 提供的压缩功能,以及以下贡献者: -
- Luca Piergentili - 感谢他提供关于压缩功能的建议和源代码贡献。
- Mark Nelson - 感谢他的 Zlib 包装类,我无情地把它改编成了我自己的代码。
自解压 (SFX) 可执行文件的描述
这个类创建的 SFX 文件包含一个提取可执行文件,数据文件附加到它的末尾。 文件末尾的数据不会影响可执行镜像,因此文件执行时就好像数据不存在一样。 因此,为了提取数据,可执行文件必须首先从自身分离数据,然后创建适当的文件。 我选择的方法是在数据之后写入一个“目录”(TOC),提取器可以读取该目录以找出各种文件存储在数据段中的位置。
TOC 的布局如下:-
从存档末尾开始,向后工作
头部信息
- 10 字节 - 签名(SFX 存档的标识符)
- 4 字节 - SFX 存档的版本号
- 4 字节 - 存档中的文件数
目录
本节包含每个文件的以下格式的一条记录
- 4 字节 - 文件名长度
- 可变长度 - 文件名
- 4 字节 - 文件长度(压缩后)
- 4 字节 - 文件长度(未压缩)
- 4 字节 - 数据在存档中的偏移量
数据段
每个文件都使用 zlib 在内存中压缩,然后按照 TOC 的顺序写入。 之后是提取器可执行文件。
如何使用
说了这么多,你不需要知道上面任何内容就可以使用它。 你只需要创建一个 CSelfExtractor 的实例,然后调用 AddFile() 来添加所有你想包含的文件。 接下来调用 Create() 来创建存档。
演示项目包含两个项目 - 'Extractor' 是提取存档的可执行文件,Self Extractor 是用于构建自解压存档的程序。 Self Extractor 允许你指定一个外部提取程序用于存档,或者你可以使用已编译到程序资源中的提取器。 阅读源代码以了解更多信息。
Zlib 源代码受 此处记录的许可协议约束。 这些演示使用了 codeguru.com 和 codeproject.com 上其他人编写的类,因此这些类中的任何错误都应指向各自的作者。
更新
2002 年 8 月 21 日 - 使用读者提出的与文件权限和 CFileDialog
相关的修复更新了代码。 此外,Zlib 已更新到 v1.14,其中修复了一个重要的安全问题。