处理来自 unrar DLL 的错误

handling errors from unrar DLL

如果您 运行 unrar 的命令行版本,它会在压缩文件无法提取时记录重要信息。 我正在尝试对 unrar DLL 做同样的事情。 我已经不得不对 DLL 源代码进行一些更改以支持注册我自己的回调以正确处理提取进度。 现在我想正确处理错误报告。 确实没有关于使用unrar源的文档。

所以我有一个可以调用的工作回调函数

CommandData *Cmd
Cmd->ErrorCallback(ERAR_BAD_DATA, Arc.FileName, ArcFileName);

如果我在我的进度 DLL 旁边调用它,该函数会很好用(所以我知道回调有效),但我就是无法弄清楚错误是在哪里处理的。 具体来说,我在处理代码 ERAR_BAD_DATA 之后,我发现它是在 extract.cpp 中处理的……但该代码似乎没有得到 运行。 我还发现了一些对 RarErrorToDll 的调用...我也把回调放在那里,什么都没有。

任何帮助将不胜感激。

为了了解一些上下文,这是我之前用来捕获错误的方法。

bool archiveCorrupt = false;
while((read_header_code = RARReadHeader(archive_data, &header_data)) == 0)
{
    process_file_code = RARProcessFile(archive_data, RAR_EXTRACT, m_output_dir, NULL);
    if(process_file_code)
    {
        qDebug() << "Error extracting volume!"
                 << header_data.ArcName << " "
                 << " with error: " << process_file_code;
        archiveCorrupt = true;
        break;
    }
}

此方法不起作用的原因是错误代码 process_file_code 告诉您出了什么问题,但 header_data.ArcName 中的存档名称是文件开始的存档,不一定腐败在哪里。我正在处理一个大文件将跨越多个档案的多部分档案……所以我需要知道哪个档案已损坏,而不仅仅是文件开始的档案。

编辑:

这里是 link 到 unrar source code

所以我在第 670 行 extract.cpp 中发现了一个地方,我可以放置回调,它 return 我的应用程序的错误代码。

     ErrHandler.SetErrorCode(RARX_CRC);
#ifdef RARDLL
    Cmd->ErrorCallback(RARX_CRC, Arc.FileName, ArcFileName);

但是,这和以前有同样的问题,它return是在处理文件提取结束时的错误,而不是在 CRC 失败的地方。

如果我 运行 您可以从 rarlabs 站点下载的 unrar 命令行应用程序,它似乎可以正确处理它并且 return 是正确的错误。我在 unrar 源中的任何地方都找不到这些错误的文本,所以我只能假设 unrar 源实际上并没有构建他们在其网站上发布的 unrar 应用程序。

Extracting from SL - Cinematic Guitars.part02.rar

...         SL - Cinematic Guitars/Cinematic Guitars/Samples/Cinematic Guitars_001.nkx  16%
SL - Cinematic Guitars/Cinematic Guitars/Samples/Cinematic Guitars_001.nkx : packed data CRC failed in volume SL - Cinematic Guitars.part02.rar

经过反复试验,我终于找到了答案。

我的问题是,我在查找错误消息时将 unrar 的旧命令行版本与较新的源代码进行了比较。 错误信息在新的源代码中已经改变,现在是

packed data checksum error in volume

这是在loclang.hpp中定义的,当错误代码为UIERROR_CHECKSUMPACKED

时,在函数uiMsgStore:Msg中从uiconsole.cpp调用

这是从第 25 行 volume.cpp 调用的

我在这里添加了我的回调,它完美地捕获了错误。

我希望这对那些不幸不得不破解 unrar 源代码的人有所帮助。