VS2015编译7z.dll
(1)到官网下载源码,http://www.7-zip.org/download.html,下载如下:
这个源码包,并解压
(2)打开cmd命名行,粘贴如下:
"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\vsvars32.bat"(带双引号)
即建立VS2015的编译环境
(3)解除Build.mak的只读性,修改源码\CPP\Build.mak"33行中的"-OPT:NOWIN98"
去掉"-OPT:NOWIN98",保存
(4)在命令行中CD到CPP\7zip所在目录,执行nmake编译Build.mak,如下:
nmake NEW_COMPILER=1 MY_STATIC_LINK=1
几分钟后编译完成,到相应的文件夹找到编译后的文件.Format7zF工程生成的文件,
在CPP\7zip\Bundles\Format7zF\O文件夹中即7z.dll
--------------------------------------------------------------------------------------
要生成静态库,请进入..\C\Util\7z目录,将工程属性改为lib类型.出现错误时,请修改如下设置:
1.项目"->"属性"->"C/C++" "常规"->"调试信息格式"->选择"程序数据库(/Zi)"或"无"
或者
2 .项目"->"属性"->"C/C++""代码生成"->"启用函数集链接"->选择"是 (/Gy)"
(5)编译好了7z.dll如何调用呢?它的源码相当复杂,在网上找了一个封装类7zip-CPP,下载链接为:
# Fork of SevenZip++ for VS2015, VS2017 (https://github.com/getnamo/7zip-cpp)
是一个静态库工程,会生成7zpp_ud.lib,请放到您的测试工程目录中。
7zip-cpp-master\7zpp是这个静态库的工程。工程目录中有个7z文夹为空,请在7z官网下载lzma源码包[LZMA SDK](http://www.7-zip.org/sdk.html),将LZMA的C和CPP两个文夹复制过来到7z文件夹下。
否则不会生成静态库7zpp_ud.lib
(6)建一个窗口工程,来测试。先包含头文件,如下:
#include <7zpp.h>
窗口类中声明成员:
CScale3DCProgress progressProc;//回调类,继承于SevenZip::ProgressCallback
.cpp中测试代码如下:
SevenZip::SevenZipLibrary lib;//声明库加载类//在窗口构造函数中,添加代码:BOOL ret = lib.Load(_T("7z.dll"));void Ctest7zDlg::OnBnClickedButton1(){//创建压缩类SevenZip::SevenZipCompressor compressor(lib, _T("abc"));compressor.SetCompressionFormat(SevenZip::CompressionFormat::SevenZip);compressor.UseAbsolutePaths(false);compressor.AddFile(_T("c:\\1.exe") );//添加文件compressor.AddDirectory(_T("C:\\util"));//添加文件夹 compressor.DoCompress(&progressProc);}
还有一点,将7zip-cpp中的7zip-cpp-master\Include\7zpp文件夹复中到测试工程中,并添加相应个路径。(窗口头文件中包含的7zpp.h就来自这个文件夹)
(7)回调类的代码如下:
#include "ProgressCallback.h"#include "SevenString.h"using namespace SevenZip;class CScale3DCProgress :public SevenZip::ProgressCallback{public: CScale3DCProgress(); ~CScale3DCProgress(); //压缩前调用 void OnStartWithTotal(const TString& archivePath, unsigned __int64 totalBytes); //压缩时,更新完成字节数 void OnProgress(const TString& archivePath, unsigned __int64 bytesCompleted); //当进度到达100%时调用 void OnDone(const TString& archivePath); //调个文件到达100%时调用 void OnFileDone(const TString& archivePath, const TString& filePath, unsigned __int64 bytesCompleted); //是否中断操作,返回true表示中断操作 bool OnCheckBreak();};
这是压缩时的回调类,还有解压的回调类,查看压缩包的文件列表回调类,请参看原文档。