处理来自unrar DLL的错误

时间:2015-12-12 04:37:08

标签: c++ error-handling unrar

如果运行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中的存档名称是文件开始的存档,不一定是腐败是。我正在处理多部分存档,其中一个大文件将跨越多个存档...所以我需要知道哪个存档已损坏,而不仅仅是文件开始存档。

编辑:

以下是unrar source code

的链接

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

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

但是,这与以前的问题相同,它在处理文件提取结束时返回错误,而不是在CRC失败的地方。

如果我运行可以从rarlabs站点下载的unrar命令行应用程序,它似乎正确处理它并返回正确的错误。我无法在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

1 个答案:

答案 0 :(得分:0)

经过大量的反复尝试后,我终于找到了答案。

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

task proguard(type: proguard.gradle.ProGuardTask) {
    ...
    libraryjars "../B.jar"
    libraryjars "../C.jar"
    ...
}

这是在packed data checksum error in volume 中定义的,当错误代码为loclang.hpp

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

这是从第25行的UIERROR_CHECKSUMPACKED调用的

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

我希望如果他们不幸遭遇黑客源代码,这对其他人有帮助。