Если вы запускаете версию командной строки unrar из командной строки, она выводит важную информацию, когда архив не удается извлечь.
Я пытаюсь сделать то же самое с unrar DLL.
Мне уже пришлось внести некоторые изменения в исходный код DLL, чтобы поддержать регистрацию моего собственного обратного вызова для правильной обработки процесса извлечения.
Теперь я хочу правильно обрабатывать сообщения об ошибках.
Там действительно нет документации по использованию источника unrar.
Так что у меня есть рабочая функция обратного вызова, которая может быть вызвана
CommandData *Cmd
Cmd->ErrorCallback(ERAR_BAD_DATA, Arc.FileName, ArcFileName);
Функция прекрасно работает, если я вызываю ее рядом с моей библиотекой выполнения (так что я знаю, что обратный вызов работает), но я просто не могу понять, где обрабатываются ошибки.
Конкретно я после обработки кода 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 исходный код
Итак, я обнаружил место в строке 670 extract.cpp, где я могу разместить обратный вызов, и он возвращает код ошибки моему приложению.
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
В конце концов я нашел ответ, после многих проб и ошибок.
Моя проблема заключалась в том, что я сравнивал старую версию unrar для командной строки с новым исходным кодом при поиске сообщений об ошибках.
Сообщение об ошибке изменилось в новом исходном коде и теперь
packed data checksum error in volume
Это определено в loclang.hpp
и позвонил из uiconsole.cpp
в функции uiMsgStore:Msg
когда код ошибки UIERROR_CHECKSUMPACKED
Это вызывается из volume.cpp
на линии 25
Я добавил свой обратный вызов здесь, и он отлично ловит ошибку.
Я надеюсь, что это поможет кому-то еще, если у него когда-нибудь будет неудача взломать исходный код unrar.
Других решений пока нет …