处理来自 unrar DLL 的错误
handling errors from unrar DLL
如果您 运行 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
中的存档名称是文件开始的存档,不一定腐败在哪里。我正在处理一个大文件将跨越多个档案的多部分档案……所以我需要知道哪个档案已损坏,而不仅仅是文件开始的档案。
编辑:
这里是 link 到 unrar source code
所以我在第 670 行 extract.cpp 中发现了一个地方,我可以放置回调,它 return 我的应用程序的错误代码。
ErrHandler.SetErrorCode(RARX_CRC);
#ifdef RARDLL
Cmd->ErrorCallback(RARX_CRC, Arc.FileName, ArcFileName);
但是,这和以前有同样的问题,它return是在处理文件提取结束时的错误,而不是在 CRC 失败的地方。
如果我 运行 您可以从 rarlabs 站点下载的 unrar 命令行应用程序,它似乎可以正确处理它并且 return 是正确的错误。我在 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
经过反复试验,我终于找到了答案。
我的问题是,我在查找错误消息时将 unrar 的旧命令行版本与较新的源代码进行了比较。
错误信息在新的源代码中已经改变,现在是
packed data checksum error in volume
这是在loclang.hpp
中定义的,当错误代码为UIERROR_CHECKSUMPACKED
时,在函数uiMsgStore:Msg
中从uiconsole.cpp
调用
这是从第 25 行 volume.cpp
调用的
我在这里添加了我的回调,它完美地捕获了错误。
我希望这对那些不幸不得不破解 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
中的存档名称是文件开始的存档,不一定腐败在哪里。我正在处理一个大文件将跨越多个档案的多部分档案……所以我需要知道哪个档案已损坏,而不仅仅是文件开始的档案。
编辑:
这里是 link 到 unrar source code
所以我在第 670 行 extract.cpp 中发现了一个地方,我可以放置回调,它 return 我的应用程序的错误代码。
ErrHandler.SetErrorCode(RARX_CRC);
#ifdef RARDLL
Cmd->ErrorCallback(RARX_CRC, Arc.FileName, ArcFileName);
但是,这和以前有同样的问题,它return是在处理文件提取结束时的错误,而不是在 CRC 失败的地方。
如果我 运行 您可以从 rarlabs 站点下载的 unrar 命令行应用程序,它似乎可以正确处理它并且 return 是正确的错误。我在 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
经过反复试验,我终于找到了答案。
我的问题是,我在查找错误消息时将 unrar 的旧命令行版本与较新的源代码进行了比较。 错误信息在新的源代码中已经改变,现在是
packed data checksum error in volume
这是在loclang.hpp
中定义的,当错误代码为UIERROR_CHECKSUMPACKED
uiMsgStore:Msg
中从uiconsole.cpp
调用
这是从第 25 行 volume.cpp
调用的
我在这里添加了我的回调,它完美地捕获了错误。
我希望这对那些不幸不得不破解 unrar 源代码的人有所帮助。