首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理unrar DLL中的错误

处理unrar DLL中的错误
EN

Stack Overflow用户
提问于 2015-12-12 04:37:08
回答 1查看 403关注 0票数 0

如果运行命令行版本的unrar,则当存档无法提取时,它会注销重要信息。我试图对unrar DLL做同样的事情。我已经对DLL源代码做了一些修改,以支持注册我自己的回调,以正确地处理提取过程。现在我想正确地处理错误报告。实际上没有关于使用unrar源代码的文档。

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

代码语言:javascript
复制
CommandData *Cmd
Cmd->ErrorCallback(ERAR_BAD_DATA, Arc.FileName, ArcFileName);

如果我在进度DLL旁边调用它(所以我知道回调可以工作),那么这个函数工作得很好,但是我不知道错误是在哪里处理的。具体来说,我是在处理代码ERAR_BAD_DATA之后,我发现它是在extract.cpp中处理的.但这段代码似乎没有被运行。我还找到了一些打给RarErrorToDll的电话..。我把电话也放那了,什么都没有。

任何帮助都将是非常感谢的。

对于一些上下文,这是我之前为了捕获错误而做的事情。

代码语言:javascript
复制
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行中发现了一个位置,我可以在其中放置回调,它确实会向我的应用程序返回一个错误代码。

代码语言:javascript
复制
     ErrHandler.SetErrorCode(RARX_CRC);
#ifdef RARDLL
    Cmd->ErrorCallback(RARX_CRC, Arc.FileName, ArcFileName);

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

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

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-14 21:14:38

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

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

代码语言:javascript
复制
packed data checksum error in volume

这是在loclang.hpp中定义的,并在错误代码为UIERROR_CHECKSUMPACKED时从函数uiMsgStore:Msg中从UIERROR_CHECKSUMPACKED中调用。

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34236313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档