7z源码的编译与使用_markdown 格式

7z作为开源的解压缩项目,支持多种格式的解压缩,由 Igor Pavlov 开发,最新的版本为 19.00 版。

源码下载位置:https://www.7-zip.org/a/7z1900-src.7z

1、源码结构

源码解压之后,是这样的结构:

路径 备注
Asm 包含主要算法的汇编实现,直接使用汇编可以提高执行效率。但是却对跨平台移植造成了一些困难
C 主要是算法的代码,由C语言实现
CPP 相关COM接口的实现,界面,工程文件等
DOC 相关文档

对于我们编译项目来说,最主要的就是 CPP 文件夹,编译的项目文件在 CPP\7zip\Bundles\ 中可以找到。

路径 备注
Alone 独立的可执行程序,支持的解压格式仅包括7z, cab, tar, zip这几种。
Alone7z 独立的可执行程序,仅支持7z格式。FM文件管理器(File Manager),通过加载7z.dll的导出函数进行解压。
Format7z 7za.dll 7z Standalone Plugin,7z 独立插件(仅7z格式)
Format7zF 7z.dll 7z Plugin, 7z插件,包含各种格式。
SFXCon 自解压(控制台程序)。
SFXSetup 自解压程序(安装包)。
SFXWin 自解压程序(Windows界面)。

2、代码的编译

打开CPP\7zip\Bundles\Format7zF\Format7z.dsw,即可打开7z.dll工程。

我使用的编译器是vs2008,打开dsw文件提示升级,转换后可生成sln文件和对应的vcproj文件。

直接编译。第一次编译,报错:1>LINK : 无法创建 .ILK 文件的映射;正在非增量链接

1>LINK : fatal error LNK1104: 无法打开文件“C:\Program Files\7-Zip\7z.dll”

解决方法:文件占用,编译器权限不够,不能对此文件进行修改,修改生成目标地址,生成到其他地方就可以了。

第二次编译,报错:

1>正在链接...
1>.\Debug\7zCrcOpt.obj : fatal error LNK1107: 文件无效或损坏: 无法在 0x276 处读取

解决方法:删除工程中的asm文件,改由对应的c文件实现,记得将这些c文件的预编译头选项改为“不使用预编译头”。

第三次编译,成功

3、内部接口

7z.dll 中的每一种支持的格式被称作 Archive,代码位于CPP\7zip\Archive中。

每一种Archive包含一个HandlerHandler里包含处理每一种Archive的接口。

每一种Archive包含一个Register,用于向全局对象注册,只有注册后的Handler才会被调用。

Handler必须继承IInArchive接口,表示可读,用于解压。(必选)

Handler可以继承IOutArchive接口,表示可写,用于压缩文档。(可选)

根据官方说明:
Packing / unpacking: 7z, XZ, BZIP2, GZIP, TAR, ZIP and WIM

仅这几种Archive是可以被压缩的,因此这些ArchiveHandler要继承IOutArchive接口。

如果代码只用于解压,而不用于压缩,可定义EXTRACT_ONLY宏,可不生成IOutArchive,可以减少文件体积。

文件 接口 说明
ICoder.h ICompressProgressInfo 设置进度,用于向外部展示进度条
ICompressCoder 解码
ICompressCoder2 同上,传出多个Stream对象
ICompressSetCoderPropertiesOpt 设置属性
ICompressSetCoderProperties 设置属性
ICompressSetDecoderProperties2 设置属性
ICompressWriteCoderProperties 将属性写入到Stream
ICompressGetInStreamProcessedSize 获取已经处理的大小
ICompressSetCoderMt 设置进程数
ICompressSetFinishMode 设置结束标志
ICompressGetInStreamProcessedSize2 获取已经处理的大小
ICompressSetMemLimit 设置内存限制
ICompressGetSubStreamSize 获取内部流文件大小
ICompressSetInStream 设置压缩传入的InStream流对象
ICompressSetInStreamSize 设置压缩传入的InStream流对象大小
ICompressSetOutStreamSize 设置压缩传出的InStream流对象
ICompressSetBufSize 设置缓冲区大小
ICompressInitEncoder 初始化编码器
ICompressSetInStream2 设置输入流
ICompressSetOutStream2 设置输出流
ICompressSetInStreamSize2 设置输入流大小
ICompressFilter 设置过滤器,只处理小于等于size的文档
ICompressCodecsInfo 获取压缩解码器信息
ISetCompressCodecsInfo 设置压缩编码器信息
ICryptoProperties 加密属性
ICryptoResetInitVector 加密,重置InitVector
ICryptoSetPassword 设置密码,用户处理加密文档。
ICryptoSetCRC 设置CRC,用于处理加密文档的。
IHasher 计算哈希接口
IHashers 哈希管理器
IStream.h ISequentialInStream 顺序可读文件流
ISequentialOutStream 顺序可写文件流
IInStream 随机可读文件流(在ISequentialInStream基础上增加Seek函数)
IOutStream 随机可写文件流(在ISequentialOutStream基础上增加Seek/SetSize函数)
IStreamGetSize 获取文件流大小
IOutStreamFinish 为可写文件流设置结束状态
IStreamGetProps 获取文件流的属性
IStreamGetProps2 获取文件流的属性
IArchive.h IInArchive 可读文档(用于输入)
IArchiveGetRawProps 文档属性
IArchiveGetRootPro
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值