обработка ошибок из unrar DLL

Если вы запускаете версию командной строки 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

0

Решение

В конце концов я нашел ответ, после многих проб и ошибок.

Моя проблема заключалась в том, что я сравнивал старую версию unrar для командной строки с новым исходным кодом при поиске сообщений об ошибках.
Сообщение об ошибке изменилось в новом исходном коде и теперь

packed data checksum error in volume

Это определено в loclang.hpp и позвонил из uiconsole.cpp в функции uiMsgStore:Msg когда код ошибки UIERROR_CHECKSUMPACKED

Это вызывается из volume.cpp на линии 25

Я добавил свой обратный вызов здесь, и он отлично ловит ошибку.

Я надеюсь, что это поможет кому-то еще, если у него когда-нибудь будет неудача взломать исходный код unrar.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]