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、压缩包相关接口

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

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

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

Handler必须继承IInArchive接口,用于传入给Handler的对象,用于解压。

Handler可以继承IOutArchive接口,用于生成Archive对象,用于压缩文档。

根据官方说明:

  • Packing / unpacking: 7z, XZ, BZIP2, GZIP, TAR, ZIP and WIM

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

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

3、代码的编译

打开 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文件的预编译头选项改为“不使用预编译头”。

第三次编译,成功。

4、外部调用

通过IDA打开7z.dll可发现其导出函数。

CreateDecoder:创建解码器

CreateEncoder:创建编码器

CreateObject:创建对象

GetHandlerProperty2:获取Handler属性

GetHandlerProperty:获取Handler属性

GetHashers:获取 IHasher 对象

GetIsArc:获取 IsArc 函数地址

GetMethodProperty:获取解码器属性。传入codecIndex和PROPID,传出PROPVARIANT*

GetNumberOfFormats:获取文件格式的数量。

GetNumberOfMethods:获取解码器的数量。

SetCaseSensitive:设置当前文件系统是否大小写敏感,WINDOWS默认不敏感,其他系统默认敏感。

SetCodecs:传入ICompressCodecsInfo对象,设置外部解码器。

SetLargePageMode:设置大内存页模式,这种模式可申请更多的内存。

------先写这么多,后续更------

7z源码的编译与使用相关推荐

  1. 对python源码进行编译,加密python脚本

    对python源码进行编译 1.生成.pyc文件 import py_compile py_compile.compile('hello.py') 2.优化源码文件 python -O -m py_c ...

  2. 初步了解mac下C源码的编译过程

    初步了解mac下C源码的编译过程 参考: 请问Mac OS X (10.9.1)下创建和使用动态链接库的方法 cc.gcc.g++.CC的区别概括 - 今晚打酱油_ - 博客园 Linux 下 的 c ...

  3. Jar包反编译后修改源码再编译

    Jar包反编译后修改源码再编译 文章目录 Jar包反编译后修改源码再编译 1. 场景 2. 详细步骤 2.1 查看源码 2.2 生成源文件 2.3 构建项目 2.4 编译成jar包 3. 参考链接 1 ...

  4. 源码下编译APK,却是总是提示,找不到符号:SystemProperties 。。。

    >>>>>在DeskClock下任意一个java文件中,import android.os.SystemProperties;然后添加user库,将layoutlib.j ...

  5. 从源码开始编译一个带有WEB服务器功能的小型LINUX(下)

    上接:从源码开始编译一个带有WEB服务器功能的小型LINUX(上) 七.为新构建的ToyLinux启用虚拟控制台 这个可以通过宿主机来实现,也可以直接启动刚构建成功的小Linux进行配置.我们这里采用 ...

  6. MySQL源码包编译安装

    +++++++++++++++++++++++++++++++++++++++++++ 标题:MySQL数据库实例部署 时间:2019年5月2日 内容:MySQL源码包进行编译,然后部署MySQL单实 ...

  7. Android FrameWork学习(一)Android 7 0系统源码下载 编译

    最近计划着研究下 Android 7.0 的系统源码,之前也没做过什么记录,这次正好将学习的内容记录下来,方便以后复习巩固. 既然要学习我们的系统源码,那我们第一步要做的就是下载源码并进行编译了. # ...

  8. 编译 php mysql 依赖包_MySQL 5.5.15源码包编译安装

    mysql果然是不愧是目前最火的数据库,自从mysql5.5.8之后,mysql的源码包编译安装都要用到cmake来进行编译了,编译的过程没有本质 mysql果然是不愧是目前最火的数据库,自从mysq ...

  9. 如何获取ubuntu源码包里面的源码进行编译

    如何获取ubuntu源码包里面的源码进行编译 1.在获取源码包之前,确保在软件源配置文件 /etc/apt/sources.list 中添加了deb-src项 2.使用如下命令获取xxx源码包的详细信 ...

  10. Nginx实战基础篇一 源码包编译安装部署web服务器

    Nginx实战基础篇一 源码包编译安装部署web服务器 版权声明: 本文遵循"署名非商业性使用相同方式共享 2.5 中国大陆"协议 您可以自由复制.发行.展览.表演.放映.广播或通 ...

最新文章

  1. clone git 修改保存路径_Git和Github详细入门教程(别再跟我说你不会Git和Github)
  2. Java服务器热部署的实现原理
  3. 清理SQL Server日志释放文件空间的终极方法
  4. docker inspect 获取 容器 镜像 元数据 简介
  5. MySQL not exists 真的不走索引么?
  6. Web开发者的最佳开发调试环境Chrome
  7. python加四位随机数_python生成四位随机数
  8. 工地小哥逆袭转行程序员的真实故事
  9. 基于队列的二叉树层次遍历
  10. arduino的串口缓冲区_C#无法从串口Arduino读取完整缓冲区
  11. mac电脑谷歌浏览器全屏显示选项卡
  12. 安装SVN后,更新项目没有对号等图标
  13. html2canvas文字消失,html2canvas截图丢失部分元素
  14. vuepress博客主题—vuepress-theme-reco
  15. sap Payment Terms Terms of payment 收付款条件
  16. 第十三届蓝桥杯省赛 python B组复盘
  17. 夜神模拟器的安装与使用
  18. 一个本科渣渣是怎么逆袭从咸鱼到Offer收割机的?绝对干货
  19. 【数据结构】——顺序表介绍(独家介绍,小白必看!!)
  20. 多态性(一)——静态多态性

热门文章

  1. 物联网毕业设计 超声波雷达可视化系统
  2. windows服务器远程端口,查看和修改Windows服务器远程桌面的默认端口
  3. 2020年值得收藏与学习280多款H5小游戏,从入门到彻底了解它(附源码)
  4. 计算机打字速录,速录员打字口诀有哪些
  5. WebView 加载网页 加载资源 总结 MD
  6. 2021创新创业基础(李家华)100分期末考试答案
  7. Android 集成微信h5支付
  8. VMware-分配 vSphere 5.0 许可证密钥
  9. 教你玩转CSDN博客
  10. APP自动化测试-2. Appium录制测试用例