如果运行命令行版本的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失败的地方返回错误。
如果我运行unrar命令行应用程序,您可以从rarlabs站点下载,它似乎正确地处理它并返回正确的错误。我在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发布于 2015-12-14 21:14:38
经过多次反复试验,我终于找到了答案。
我的问题是,在查找错误消息时,我正在将旧命令行版本unrar与更新的源代码进行比较。错误消息已在新源代码中更改,现在为
packed data checksum error in volume这是在loclang.hpp中定义的,并在错误代码为UIERROR_CHECKSUMPACKED时从函数uiMsgStore:Msg中从UIERROR_CHECKSUMPACKED中调用。
这是从第25行的volume.cpp调用的
我在这里添加了我的回调,它完美地捕获了错误。
我希望这对其他人有帮助,如果他们有不幸不得不破解unrar源代码。
https://stackoverflow.com/questions/34236313
复制相似问题