7z 压缩类 进度条 回调函数

首先去7z官网下载代码 7z的源代码或者lzma都可以,但是推荐下7z的源代码,里面东西比较全

7z.dll 通过 COM 接口工作。但是它并没有使用标准的 COM 接口 。如果有com基础的话 看他的代码会比较容易。

比较简单的例子是 /cpp/7zip/ui/client7z 里面有简单的 压缩 解压缩 和查看压缩包文件。 7z.dll的源代码在 bundles/7zformatf 里面

其中 clinet7z和 file manager的代码看起来比较好理解,可以自己一步一步跟着走。 // 晚上再更新

7z.dll 采用com接口工作,但是它并没有使用标准的COM接口。

对文件的解压主要靠下面两个回调类

/ Archive Open callback class

// 压缩文件打开回调类  class CArchiveOpenCallback:

public IArchiveOpenCallback,

public ICryptoGetTextPassword,

public CMyUnknownImp

// 解压回调类  class CArchiveExtractCallback:

public IArchiveExtractCallback,

public ICryptoGetTextPassword,

public CMyUnknownImp

解压回调类中

// IProgress

STDMETHOD(SetTotal)(UInt64 size); //获得加压文件总字节数

STDMETHOD(SetCompleted)(const UInt64 *completeValue); //获取当前解压文件大小字节数 可以再这个回调函数中自己计算当前的解压进度。

//IArchiveExtractCallback

STDMETHOD(GetStream)(UInt32 index, ISequentialOutStream **outStream,Int32 askExtractMode); //获取文件流,

LRESULT MyReleaseSteam(); //当取消解压时,释放文件流控制权原因取消解压后没有走到SetOperationResult()回调函数,而释放文件流就在这个函数中,所以要自己释放。

//获取接口函数

CreateObjectFunc createObjectFunc = (CreateObjectFunc)lib.GetProc("CreateObject");

CMyComPtr<IInArchive> archive;

errorcode =  createObjectFunc(&CLSID_CFormat7z, &IID_IInArchive, (void **)&archive);

CInFileStream *fileSpec = new CInFileStream;

CMyComPtr<IInStream> file = fileSpec;

UString archiveName = GetUnicodeString(inFile);

if (!fileSpec->Open(archiveName))

{

//打不开压缩文件,(找不到该文件)

return ;

}

CArchiveOpenCallback *openCallbackSpec = new CArchiveOpenCallback;

CMyComPtr<IArchiveOpenCallback> openCallback(openCallbackSpec);

openCallbackSpec->PasswordIsDefined = false;

errorcode = archive->Open(file, 0, openCallback);

if (errorcode != S_OK)

return;

// Extract command

CArchiveExtractCallback *extractCallbackSpec = new CArchiveExtractCallback;

CMyComPtr<IArchiveExtractCallback> extractCallback(extractCallbackSpec);

extractCallbackSpec->Init(archive, OutFile); // second parameter is output folder path

extractCallbackSpec->PasswordIsDefined = false;

extractCallbackSpec->SetFileInfo(info);

// extractCallbackSpec->PasswordIsDefined = true;

// extractCallbackSpec->Password = L"1";

errorcode = archive->Extract(NULL, (UInt32)(Int32)(-1), false, extractCallback);

if (errorcode != S_OK)

return;

时间: 2024-10-10 21:02:57

7z 压缩类 进度条 回调函数的相关文章

类中的回调函数

失败原因 由于类的成员函数有隐含的this指针传递,从而导致一个CALLBACK型的成员函数安装时函数参数个数不匹配. 解决方法 1)将回调函数挪出类外,并声明为友元 2)将回调函数生命为静态成员函数(使用回调函数的某个参数传递当前对象的this指针) 类中的回调函数,码迷,mamicode.com

BASH Shell 简易进度条小函数

不多说,直接上脚本. # processbar <current> <total> processbar() { local current=$1; local total=$2; local maxlen=80; local barlen=66; local perclen=14; local format="%-${barlen}s%$((maxlen-barlen))s" local perc="[$current/$total]" l

Java通过匿名类来实现回调函数

在C语言中,函数名可以当做函数指针传递给形参从而实现回调 void f1() { printf("f1()\n"); } void f2() { printf("f2()\n"); } void f3() { printf("f3()\n"); } void do_func(void(*f)()) { f(); } int main() { do_func(f1); do_func(f2); do_func(f3); } 在C++11中,实现回调

进度条打印函数

进度条打印: import time def progress(percent,width=30): text=('\r[%%-%ds]'%width)%('x'*int(percent*width)) text=text+'%3s%%' text=text%(round(percent*100)) print(text,end='') file_size=10240 cur_size=0 while True: cur_size+=1024 progress(cur_size/file_siz

一个可以实现进度条的函数

1 #!/usr/bin/env python 2 #-*- coding:utf-8 -*- 3 import threading 4 import time 5 ''' 6 class Demo: 7 def __init__(self,thread_num=5): 8 self.thread_num=thread_num 9 def productor(self,i): 10 print "thread-%d start" %i 11 def start(self): 12 th

回调函数中调用类中的非静态成员变量或非静态成员函数

有关这方面的问题,首先说一点: 回调函数必须是静态成员函数或者全局函数来实现回调函数,大概原因是普通的C++成员函数都隐含了一个函数参数,即this指针,C++通过传递this指针给成员函数从而实现函数可以访问类的特定对象的数据成员.由于this指针的原因,使得一个普通成员函数作为回调函数时就会因为隐含的this指针问题使得函数参数个数不匹配,从而导致回调函数编译失败. 基于上面的理论,如何在类中封装回调函数呢? 回调函数只能是全局函数或者静态成员函数,但是由于全局函数会破坏封装性,所以只能用静

PHP – 在类中使用array_filter时回调函数的问题

了一个类处理好友,其中有一个方法用来同步好友,而这个方法中需要从微博传来的关注列表和粉丝列表中,找到互相关注的用户,记录一下经验,主要还是关于回调函数. 按照我最初的理解,这样写就可以了 private function getMutualFromSina ($focusList) { return array_filter($focusList, "filterSinaList"); } private function filterSinaList ($value) { retur

cocos2dx基础篇(23)——进度条CCProgressTimer

[唠叨] 哎,周围的同学都在搞cocos2dx 3.X了,而我还在用2.2.3.没办法,网上3.X的教程毕竟很少,还是等我的同学学得差不多了,我再换成3.X跟着同学搞,哪里不会问哪里. 本节主要来讲讲进度条CCProgressTimer,相信大家也不会陌生的吧.如安装软件时显示的进度.游戏中人物的HP.MP显示的百分比横条. [致谢] http://gl.paea.cn/contents/2260d48c5e2bc83d.html (没错,又是这位大牛...) [CCProgressTimer]

python3 简单进度条代码

进度条代码函数实现 import sys, time class ShowProcess(object): """ 显示处理进度的类 调用该类相关函数即可实现处理进度的显示 """ #i = 0 # 当前的处理进度 #max_steps = 0 # 总共需要处理的次数 #max_arrow = 50 #进度条的长度 # 初始化函数,需要知道总共的处理次数 def __init__(self, max_steps): self.max_steps