0

如果您运行 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源代码的链接

因此,我在 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
4

1 回答 1

0

经过大量的反复试验,我最终找到了答案。

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

packed data checksum error in volume

当错误代码loclang.hppuiconsole.cppuiMsgStore:MsgUIERROR_CHECKSUMPACKED

volume.cpp这从第 25 行调用

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

如果他们不幸不得不破解 unrar 源代码,我希望这对其他人有所帮助。

于 2015-12-14T21:14:38.237 回答