如果运行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
中的存档名称是文件开始的存档,不一定是腐败是。我正在处理多部分存档,其中一个大文件将跨越多个存档...所以我需要知道哪个存档已损坏,而不仅仅是文件开始存档。
所以我在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
答案 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
调用的
我在这里添加了我的回调,它完美地捕获了错误。
我希望如果他们不幸遭遇黑客源代码,这对其他人有帮助。