7z源码的编译与使用
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源码的编译与使用相关推荐
- 对python源码进行编译,加密python脚本
对python源码进行编译 1.生成.pyc文件 import py_compile py_compile.compile('hello.py') 2.优化源码文件 python -O -m py_c ...
- 初步了解mac下C源码的编译过程
初步了解mac下C源码的编译过程 参考: 请问Mac OS X (10.9.1)下创建和使用动态链接库的方法 cc.gcc.g++.CC的区别概括 - 今晚打酱油_ - 博客园 Linux 下 的 c ...
- Jar包反编译后修改源码再编译
Jar包反编译后修改源码再编译 文章目录 Jar包反编译后修改源码再编译 1. 场景 2. 详细步骤 2.1 查看源码 2.2 生成源文件 2.3 构建项目 2.4 编译成jar包 3. 参考链接 1 ...
- 源码下编译APK,却是总是提示,找不到符号:SystemProperties 。。。
>>>>>在DeskClock下任意一个java文件中,import android.os.SystemProperties;然后添加user库,将layoutlib.j ...
- 从源码开始编译一个带有WEB服务器功能的小型LINUX(下)
上接:从源码开始编译一个带有WEB服务器功能的小型LINUX(上) 七.为新构建的ToyLinux启用虚拟控制台 这个可以通过宿主机来实现,也可以直接启动刚构建成功的小Linux进行配置.我们这里采用 ...
- MySQL源码包编译安装
+++++++++++++++++++++++++++++++++++++++++++ 标题:MySQL数据库实例部署 时间:2019年5月2日 内容:MySQL源码包进行编译,然后部署MySQL单实 ...
- Android FrameWork学习(一)Android 7 0系统源码下载 编译
最近计划着研究下 Android 7.0 的系统源码,之前也没做过什么记录,这次正好将学习的内容记录下来,方便以后复习巩固. 既然要学习我们的系统源码,那我们第一步要做的就是下载源码并进行编译了. # ...
- 编译 php mysql 依赖包_MySQL 5.5.15源码包编译安装
mysql果然是不愧是目前最火的数据库,自从mysql5.5.8之后,mysql的源码包编译安装都要用到cmake来进行编译了,编译的过程没有本质 mysql果然是不愧是目前最火的数据库,自从mysq ...
- 如何获取ubuntu源码包里面的源码进行编译
如何获取ubuntu源码包里面的源码进行编译 1.在获取源码包之前,确保在软件源配置文件 /etc/apt/sources.list 中添加了deb-src项 2.使用如下命令获取xxx源码包的详细信 ...
- Nginx实战基础篇一 源码包编译安装部署web服务器
Nginx实战基础篇一 源码包编译安装部署web服务器 版权声明: 本文遵循"署名非商业性使用相同方式共享 2.5 中国大陆"协议 您可以自由复制.发行.展览.表演.放映.广播或通 ...
最新文章
- clone git 修改保存路径_Git和Github详细入门教程(别再跟我说你不会Git和Github)
- Java服务器热部署的实现原理
- 清理SQL Server日志释放文件空间的终极方法
- docker inspect 获取 容器 镜像 元数据 简介
- MySQL not exists 真的不走索引么?
- Web开发者的最佳开发调试环境Chrome
- python加四位随机数_python生成四位随机数
- 工地小哥逆袭转行程序员的真实故事
- 基于队列的二叉树层次遍历
- arduino的串口缓冲区_C#无法从串口Arduino读取完整缓冲区
- mac电脑谷歌浏览器全屏显示选项卡
- 安装SVN后,更新项目没有对号等图标
- html2canvas文字消失,html2canvas截图丢失部分元素
- vuepress博客主题—vuepress-theme-reco
- sap Payment Terms Terms of payment 收付款条件
- 第十三届蓝桥杯省赛 python B组复盘
- 夜神模拟器的安装与使用
- 一个本科渣渣是怎么逆袭从咸鱼到Offer收割机的?绝对干货
- 【数据结构】——顺序表介绍(独家介绍,小白必看!!)
- 多态性(一)——静态多态性