您好,登錄后才能下訂單哦!
(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(); };
這是壓縮時的回調類,還有解壓的回調類,查看壓縮包的文件列表回調類,請參看原文檔。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。