无忧启动论坛

标题: 请教,如何调用 7zxa.dll 解压7z文件 ? [打印本页]

作者: 阿弥陀佛    时间: 2014-7-7 15:44
标题: 请教,如何调用 7zxa.dll 解压7z文件 ?
本帖最后由 阿弥陀佛 于 2014-10-19 15:14 编辑


这个问题比较麻烦,已经找到代替的方案,使用7-zip32.dll会更简单。
=================================================

如题,哪位大侠知道 7zxa.dll 如何调用的?烦请告知,感激不尽!
注意不是7z.dll。
7zxa.dll只有170k,只能用来解压7z压缩格式。winrar就是调用它来解压7z的。
附上7zxa.dll 7zxa.zip (83.79 KB, 下载次数: 236)
作者: 2010laocfan    时间: 2014-7-7 21:57
本帖最后由 2010laocfan 于 2014-7-7 22:04 编辑

7-Zip 附加包 9.22 包含
7za.dll      - 7z 档案运行库。
7zxa.dll     - 7z 档案释放运行库。
7zS.sfx         - 安装包 SFX 模块。
7zSD.sfx        - 安装包 SFX 模块(需调用 msvcrt.dll)
7zS2.sfx        - 精简版 SFX 模块(GUI 版本,需调用 msvcrt.dll)
7zS2con.sfx     - 精简版 SFX 模块(命令行版本,需调用 msvcrt.dll)
7zr.exe      - 独立的 7-Zip 命令行版本
7zr.exe      - 低版本的 7za.exe 命令行
7-zip.chm    - 帮助文件
License.txt  - 版权许可信息
readme.txt   - 自述文档(当前文件)
history.txt  - 7-Zip 历史
Far\            - FAR 管理器插件
Installer\      - 制作安装包所需文件
x64\            - x64 DLL 文件

zh-cn.txt    - 最新版本语言文件(Nightly Build)
7z.sfx          - 自释放模块(GUI 版本)
7zCon.sfx       - 自释放模块(命令行版本)
Docs\           - 7-Zip 自述、历史更新、帮助文件


7za.dll 特征:
  - 支持 7z 格式
  - 内置编码器:LZMA、LZMA2、PPMD、BCJ、BCJ2、COPY、AES-256 加密。
  - 内置解码器:LZMA、LZMA2、PPMD、BCJ、BCJ2、COPY、AES-256 加密、BZip2、Deflate。
7zxa.dll 则只支持解压缩 .7z 格式。

由此推断7zxa.dll可能由早期的7z.dll改名而来,只是一个库配合exe才能运行,命令行运行7z /?
换言之,完整功能两个都要;只解压缩 .7z 只要7zxa.dll
作者: 阿弥陀佛    时间: 2014-7-7 22:21
本帖最后由 阿弥陀佛 于 2014-7-7 22:23 编辑
2010laocfan 发表于 2014-7-7 21:57
7-Zip 附加包 9.22 包含
7za.dll      - 7z 档案运行库。
7zxa.dll     - 7z 档案释放运行库。


谢谢回复!不过这些我知道。7zxa不是早期的7z.dll改名的。新版的9.20也有这个dll。它只能用来解压7z格式文件。我只需要用这功能。而且它体积很小,dll方便被其它程序调用。就是不知道该怎么调用它。网上也找不到资料。
作者: chenall    时间: 2014-7-8 08:08
解压一个文件并不是只需要一两个调用就可以实现的.涉及到内存分配,数据处理等.

要解压7z格式,首先需要了解7z的格式,然后才能通过SDK来针对性处理..

需要的资料在这里都可以找到,懂得编程的应该可以找到方法.

http://www.7-zip.org/sdk.htm

我对解压这一块也不熟,帮不上忙,你可以自己研究一下.这里也有一个VB调用的例子

https://github.com/wqweto/VszLibl

若你是想要编程使用就可以用7zxa的DLL,否则建议直接使用7z.exe(不包含DLL)或7za.exe(包含了DLL).会比较方便.
作者: bbs.beikeit.com    时间: 2014-7-29 21:07
7zxa.dll是一个库文件,需要和相关文件配合使用!它本身无法完成数据解压!
以上是我个人的了解与解析文件得到的结果仅供参考,不保证正确!

可以尝试 7z.dll与7z.exe配合使用,且不同位宽系统要用不同版本!
作者: bbs.beikeit.com    时间: 2014-7-29 21:16
bbs.beikeit.com 发表于 2014-7-29 21:07
7zxa.dll是一个库文件,需要和相关文件配合使用!它本身无法完成数据解压!
以上是我个人的了解与解析文件 ...

7zxa.dll我也没查到资料,看函数也没看出有调用接口。所以就不知道了!
X64版7Z.exe与7z.dll打包成exe后也不到530KB!
总之系统环境好复杂,我曾经测试在自己电脑上一个7z.dll就可以完成解压和打包,但是放别人电脑就不行,后来7Z.exe和7z.dll一起了就没再出问题。
作者: wylgogogo    时间: 2014-7-29 22:07
受教了,好像没几个觉得7zip大了。楼主研究出来露个头,我们好学习下。
作者: 2011mking    时间: 2014-7-30 09:47
本帖最后由 2011mking 于 2014-7-30 09:50 编辑

网上找的这个单元调用7z.dll可以实现压缩与解压。
sevenzip.rar (9.98 KB, 下载次数: 111)
调用时uses sevenzip;
uses sevenzip;

function ProgressCallback(Sender: Pointer; total: boolean; value: int64)
  : HRESULT; stdcall;
begin
  if total then
    FormMain.ProgressBar.Max := value
  else
    FormMain.ProgressBar.Position := value;
  Result := S_OK;
end;

procedure TFormMain.btnAddFilesClick(Sender: TObject);
var
  Counter: Integer;
begin
  if OpenDialog.Execute then
  begin
    for Counter := 0 to OpenDialog.Files.Count - 1 do
    begin
      memoOutput.Lines.Append(OpenDialog.Files[Counter]);
    end;
  end;
end;

procedure TFormMain.btnCompressClick(Sender: TObject);
var
  Arch: I7zOutArchive;
  Counter: Integer;
begin
  if OpenDialog.Files.Count = 0 then
  begin
    ShowMessage('请添加文件');
    Exit;
  end;
  memoOutput.Lines.Append('开始压缩');
  Arch := CreateOutArchive(CLSID_CFormat7z);
  Arch.SetProgressCallback(nil, ProgressCallback);
  for Counter := 0 to OpenDialog.Files.Count - 1 do
    Arch.AddFile(OpenDialog.Files[Counter],
      ExtractFileName(OpenDialog.Files[Counter]));
  SetCompressionLevel(Arch, 5);

  //SevenZipSetCompressionMethod(Arch, T7zCompressionMethod.m7Deflate64);
  SevenZipSetCompressionMethod(Arch, m7Deflate64);

  Arch.SaveToFile('.\test.7z');
  memoOutput.Lines.Append('完成压缩');
  Arch := nil;
end;

procedure TFormMain.btnExtractClick(Sender: TObject);
var
  Arch: I7zInArchive;
  Counter: Integer;
begin
  if not FileExists('.\test.7z') then
  begin
    ShowMessage('请先成生压缩文件');
    Exit;
  end;
  memoOutput.Lines.Append('开始解压缩');
  Arch := CreateInArchive(CLSID_CFormat7z);
  Arch.SetProgressCallback(nil, ProgressCallback);
  Arch.OpenFile('.\test.7z');
  for Counter := 0 to Arch.NumberOfItems - 1 do
  begin
    if not Arch.ItemIsFolder[Counter] then
      memoOutput.Lines.Append('包含文件:' + Arch.ItemPath[Counter]);
  end;
  if ForceDirectories('.\Extract') then
  begin
    Arch.ExtractTo('.\Extract');
    memoOutput.Lines.Append('完成解压缩');
    Arch := nil;
  end
  else
    ShowMessage('无法解压到指定目录');
end;

只能解压、压缩,无法打包成自解压。

配合这个版本的7z.dll 没问题,其它的没测过 7zdll.rar (273.38 KB, 下载次数: 100)
作者: 2013gdh    时间: 2014-7-30 13:52
2011mking 发表于 2014-7-30 09:47
网上找的这个单元调用7z.dll可以实现压缩与解压。

调用时uses sevenzip;

高人啊. 自解压那个不用想了, 需要sfx文件作为exe的文件头配合. 其实7z和rar的自解压都是类似"copy exe.sfx + 配置文件.txt+压缩包.7z/.rar xxxx.exe"做出来的, 只不过rar可以在生成自解压程序时修改sfx文件的资源, 比7-zip shell做的更细致
作者: jixiangyaoxuexi    时间: 2014-11-1 22:09
不知道能不能用,明天试一下

作者: captain_g    时间: 2014-11-3 16:44
P 大的 0PE 右键菜单中有 7za 压缩与解压缩,他用的好像是 190KB 大小的 7za.exe。

应该不是佛大所指。
作者: huaqingyuan    时间: 2015-10-18 17:55
7Z自解压文件比非自解压就大了50KB。我觉得这个头部文件就是最小的解压7Z的程序,但是需要高手们该一下才能用
作者: boy6585948    时间: 2015-10-19 10:49
chenall 发表于 2014-7-8 08:08
解压一个文件并不是只需要一两个调用就可以实现的.涉及到内存分配,数据处理等.

要解压7z格式,首先需要了 ...

一般都是接口调用,或者命令行的调用!!!




欢迎光临 无忧启动论坛 (http://bbs.c3.wuyou.net/) Powered by Discuz! X3.3