热门IT资讯网

VS2015编译7z.dll

发表于:2024-11-24 作者:热门IT资讯网编辑
编辑最后更新 2024年11月24日,(1)到官网下载源码,http://www.7-zip.org/download.html,下载如下:这个源码包,并解压(2)打开cmd命名行,粘贴如下:"C:\Program Files (x86)

(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();};

这是压缩时的回调类,还有解压的回调类,查看压缩包的文件列表回调类,请参看原文档。

0