Delphi 如何解决;Sevenzip:错误结果(00000001)函数不正确“;使用JCL压缩单元

Delphi 如何解决;Sevenzip:错误结果(00000001)函数不正确“;使用JCL压缩单元,delphi,compression,lzma,Delphi,Compression,Lzma,我正在使用JCL版本2.4.1.4571和Delphi XE3,但没有幸解压缩归档文件。我从绝地的网站下载了dll,还尝试使用7-zip.org上的7z.dll(32位),但无论哪种方式,我在尝试“提取所有”时都会遇到相同的错误 请参见下面的功能: function TForm1.Decompress(FileName, DestDir: String): Boolean; var archiveclass: TJclDecompressArchiveClass; Myarchive:

我正在使用JCL版本2.4.1.4571和Delphi XE3,但没有幸解压缩归档文件。我从绝地的网站下载了dll,还尝试使用7-zip.org上的
7z.dll
(32位),但无论哪种方式,我在尝试“提取所有”时都会遇到相同的错误

请参见下面的功能:

function TForm1.Decompress(FileName, DestDir: String): Boolean;

var
  archiveclass: TJclDecompressArchiveClass;
  Myarchive: TJclDecompressArchive;

begin
  Decompress := False;
  // Filename = name.7z or name.zip (simple test zips nothing fancy)
  // DestDir = fully qualified path to an existing directory
  archiveclass := GetArchiveFormats.FindDecompressFormat(FileName); 
  Try
    if Assigned(archiveclass) then
      Begin
        Myarchive := archiveclass.Create(FileName);
        if (Myarchive is TJclSevenZipDecompressArchive) then
          Begin
            try
              Myarchive.ListFiles; { Fails without doing this first }
{ ExtractAll (AutocreateSubDir) must be set true if arc has directories or it will crash }
              Myarchive.ExtractAll(DestDir, True); 
              Decompress := True;
            except on E: EJclCompressionError do
              Begin
                ShowMessage(e.Message); 
              End;
            end;
          End
        Else
          ShowMessage('Not supported by 7z.dll'); 
      End;
  Finally
    MyArchive.Free;
  End;
end;
当我执行
MyArchive.ExtractAll
行时,我得到一个异常
Sevenzip:Error result(00000001)错误函数。
我的代码基于StackOverflow上其他人的代码。我是否错过了我需要首先做的事情,或者这是一个bug?我用
MyArchive.ListFiles
替换了提取行,并得到了相同的错误(我在这里的一个示例中看到了这一点;但是,我还没有发现ListFiles的用途。
编译为32位目标

编辑:使用7-zip创建了一系列不同类型的归档文件,并尝试使用我的程序对每个文件进行解压缩。我发现的第一件事是,如果归档文件包含文件目录,如果不将第二个参数设置为True,ExtractAll将崩溃。然后,我使用不同的压缩方法测试了归档文件

使用LZMA2 Ultra compression的.7z存档会给出Hresult=1错误

使用LZMA Ultra compression的.zip存档会出现Hresult=1错误

.zip使用Deflate或deflate64风格的存档都可以正常工作。


看来这个库根本不能处理LZMA压缩。既然7z.dll不能处理它毫无意义,我猜问题出在JEDI JCL代码上。我需要能够压缩/解压。7z和.zip在这个库中使用LZMA,或者我可以先使用内置的zip。还有什么建议吗非常感谢。

我认为这是一个JCL实现错误。7z使用COM接口,并返回HRESULT代码。JCL试图使用SysErrorMessase()将它们转换为错误消息,但似乎它只适用于Win32错误代码,而不适用于HRESULT。这样,返回代码S_FALSE就会映射到error_INVALID_函数(请参阅)。 我的猜测是,出于某种原因,7z调用返回S_FALSE,因为它在解压缩时遇到了一些问题,而错误是错误的


另请参见。

进一步搜索这个问题

显示“如果文件名不是小写,FindDecompressFormat找不到存档格式。”

我尝试将传递的字符串改为小写,并成功地解压缩了LZMA归档文件

archiveclass := GetArchiveFormats.FindDecompressFormat(lowercase(FileName));

如果绝地JCL有任何文档的话,它将是一个很酷的库——sad。

如果你用一个不存在的文件名调用TJclZipDecompressArchive,你会在ListFiles函数中得到同样的、没有太多帮助的错误消息


故事的寓意是在调用api之前自己检查文件是否存在。

是的,应用程序是32位FWIW,OleCheck是将HResult转换为异常的方法。@LDS谢谢。我仍在调查。我仔细查看了代码,发现HResult作为异常发送。我仍然不知道为什么。问题似乎与存档有关使用LZMA作为压缩方法。请参见上面我的编辑。哪个函数返回“error”值?IIRC一些7z函数调用回调函数,其中“real”设置并返回错误值。下载并检查7z代码,应该有一个小的命令行客户端示例。@LDS,我不确定我是否理解您的建议。您是否建议我下载7Zip LZMA源代码并查看它?JCLCompression单元中的函数是“OpenArchive”