Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблемы при обработке текста через DJVU IFilter (LTIFilter.DLL) всех версий

402
25 марта 2009 года
ToRNaDo
70 / / 27.01.2004
Пишу поисковую систему для документов разных текстовых форматов.

IFilter для PDF, офисных документов, картинок - всё нормально работает.

Фильтр DjVu обрабатывает пару тысяч файлов и виснет, причём ошибка чтения происходит в библиотеке NTDLL.

======================================================
Project WebSearch.exe raised exception class $C0000005 with
message 'access violation at 0x7c91b1fa: write of address 0x00000010'.
ntdll.RtlpWaitForCriticalSection
======================================================
Project WebSearch.exe raised exception class $C0000005 with
message 'access violation at 0x020f3913: read of address 0xabab0043'.
LTIFilter.DllRegisterServer
======================================================

У кого такое было? Как лечится?
397
25 марта 2009 года
SergPas
527 / / 03.02.2007
А где брал SDK, если не секрет конечно?
246
25 марта 2009 года
GIZMO
1.8K / / 30.07.2004
Цитата: SergPas
А где брал SDK, если не секрет конечно?


IFilter

402
26 марта 2009 года
ToRNaDo
70 / / 27.01.2004
странно. какой ещё SDK?
14
26 марта 2009 года
Phodopus
3.3K / / 19.06.2008
Цитата: ToRNaDo
Фильтр DjVu обрабатывает пару тысяч файлов и виснет, причём ошибка чтения происходит в библиотеке NTDLL.
У кого такое было? Как лечится?


Выясните файл на котором происходит обвал. Скорее всего файл поврежден, а в фильтре ошибка. (вряд ли ошибка будет в ntdll).

402
26 марта 2009 года
ToRNaDo
70 / / 27.01.2004
Пока сделал заплатку. Если программа повиснет во время обработки, в следующий раз этот файл будет пропущен. В реестре останется запись с именем файла.

 
Код:
if Tools.Config_ReadStr('dangerous',ExtractFileName(File1),'normal')='normal' then
  begin
   Tools.Config_WriteStr('dangerous',ExtractFileName(File1),'danger');
   SPFilter.GetFileContentsFromIFilter(File1, OutData);
   Tools.Config_DeleteKey('dangerous',ExtractFileName(File1));
  end;


Но это не серьёзно :-( .
402
27 марта 2009 года
ToRNaDo
70 / / 27.01.2004
Эх... нужно было после завершения фильтрации документа выгружать библиотеку... И как я сразу не догадался?!
402
31 марта 2009 года
ToRNaDo
70 / / 27.01.2004
Программа виснет при освобождении библиотеки фильтра LTIFilter.DLL функцией FreeLibrary().

Это лечится?
14
31 марта 2009 года
Phodopus
3.3K / / 19.06.2008
Цитата: ToRNaDo
Программа виснет при освобождении библиотеки фильтра LTIFilter.DLL функцией FreeLibrary().

Это лечится?


Разве что новой версией

402
31 марта 2009 года
ToRNaDo
70 / / 27.01.2004
LTIFilter.DLL

1.0.0.537 Copyright (c)1996-2003
1.1.0.861 Copyright (c)1996-2004
1.1.1.1320 Copyright (c)1996-2004

Какие ещё бывают?
14
31 марта 2009 года
Phodopus
3.3K / / 19.06.2008
Вы меня не поняли. Ждать. Новую версию. Можно даже авторам написать об ошибке - так они ее быстрее исправят и, след-но, быстрее появится новая версия.
402
01 апреля 2009 года
ToRNaDo
70 / / 27.01.2004
Мда... это была обычная алгоритмическая ошибка...
402
02 апреля 2009 года
ToRNaDo
70 / / 27.01.2004
Однако! Все равно лезут ошибки Access Violation!

Я заметил, что если закоментировать строчку FreeLibrary(DLLHandle), то ошибок не будет. Что бы это значило?
6
03 апреля 2009 года
George
4.1K / / 05.01.2007
видимо пытается выгрузить либу, которая уже выгружена. перед этой строчкой сделай что то типа ShowMessage(IntToStr(DLLHandle));. Ну и проверку можно типа
if DLLHandle > 0 then FreeLibrary(DLLHandle);
402
03 апреля 2009 года
ToRNaDo
70 / / 27.01.2004
это для супер-параноиков:

 
Код:
if (DLLHandle>=32) then
    if DLLHandle=GetModuleHandle(PAnsiChar(FilterDLL)) then
     FreeLibrary(DLLHandle);
6
03 апреля 2009 года
George
4.1K / / 05.01.2007
ну не, имхо, вторая строчка лишняя...
303
06 апреля 2009 года
makbeth
1.0K / / 25.11.2004
А с какого перепугу переменная DLLHandle получит нулевое значение если библиотека таинственным образом выгружается непонятно где? Откуда библиотека знает про DLLHandle, чтобы обнулить ее при выгрузке? ;)
402
07 апреля 2009 года
ToRNaDo
70 / / 27.01.2004
тогда уж вот так

 
Код:
DLLHandle := GetModuleHandleA(PAnsiChar(FilterDLL));
   //заново определяем - а загружена ли вообще библиотека?
   if (DLLHandle>=32) then
     FreeLibrary(DLLHandle);
402
14 апреля 2009 года
ToRNaDo
70 / / 27.01.2004
Однако!

Я перед выгрузкой библиотеки обнулял указатели на функции:
 
Код:
DllGetClassObject:=nil;
DllCanUnloadNow:=nil;
DllRegisterServer:=nil;


А надо было делать так:
 
Код:
@DllGetClassObject:=nil;
@DllCanUnloadNow:=nil;
@DllRegisterServer:=nil;


Вот и вылетал Access Violation...
402
12 марта 2010 года
ToRNaDo
70 / / 27.01.2004
Народ! Проблема то осталась!

Djvu IFilter (LTIFilter.DLL) обрабатывает несколько файлов и виснет!

Чего делать то?
14
12 марта 2010 года
Phodopus
3.3K / / 19.06.2008
Молодец! Год прошел.. проблема осталась! Прям как все у нас в стране...
Цитата:

Новая версия-то не появилась?

402
12 марта 2010 года
ToRNaDo
70 / / 27.01.2004
За этот год программа сильно изменилась, но с ошибкой я не справился.

Новой версии фильтра я не нашёл.

Может быть, кто нибудь ещё создал djvu-фильтр, кроме Lizard-Tech?
402
15 марта 2010 года
ToRNaDo
70 / / 27.01.2004
Кажется, я понял, в чём проблемма!

Я составил список файлов, которые обрабатывались с ошибками,
и теперь буду их игнорировать.

Остальные файлы индексируются успешно.
253
15 марта 2010 года
Proger_XP
1.5K / / 07.08.2004
Цитата:
Кажется, я понял, в чём проблемма!


<>

Цитата:
и теперь буду их игнорировать.


Вряд ли проблема была в том, что ты не игнорировал (не)нужные файлы...

402
15 марта 2010 года
ToRNaDo
70 / / 27.01.2004
Я заметил, что в консольном приложении LTIfilter.DLL выводит ошибки на экран.

 
Код:
** Unrecognized DjVu Message: [Contact LizardTech for assistance]
** Message name:  DjVuFile.failed
Parameter: file://localhost/D:/001-200-g4_0055.djvu


 
Код:
** Unrecognized DjVu Message: [Contact LizardTech for assistance]
** Message name:  EOF


 
Код:
** Unrecognized DjVu Message: [Contact LizardTech for assistance]
** Message name:  ByteStream.open_fail
Parameter: 095_0001_1.djbz
Parameter: No such file or directory


 
Код:
** Unrecognized DjVu Message: [Contact LizardTech for assistance]
** Message name:  ByteStream.open_fail
Parameter: 095_0001_1.djbz
Parameter: No such file or directory


 
Код:
** Unrecognized DjVu Message: [Contact LizardTech for assistance]
** Message name:  DjVuFile.failed
Parameter: file://localhost/D:/rl28_3-4_091.djvu


 
Код:
** Unrecognized DjVu Message: [Contact LizardTech for assistance]
** Message name:  JB2Image.need_dict


может ли вывод ошибок подвешивать программу, которая работает в режиме сервиса?
253
15 марта 2010 года
Proger_XP
1.5K / / 07.08.2004
А ты пробовал сделать самое минимальное приложение, которое бы обрабатывало один из тех файлов, которые вешают прогу, когда она индексирует веб?

Чем меньше кода, тем лучше. Если прога будет по прежнему вешатся, тогда по крайней мере поймёшь, что ~50% где-то за ошибку в фильтре (другие 50 - за ошибку в твоём использовании его). Если же всё будет работать, то значит фильтр в порядке, и проблема где-то у тебя.
402
15 марта 2010 года
ToRNaDo
70 / / 27.01.2004
Код:
program test1;

{$APPTYPE CONSOLE}

uses
  Windows, Messages, SysUtils, Classes, Tools, Math, SPFilter;

var
 Data1:TMemoryStream;
 Files:TStrings;
 x:integer;
begin
 Files:=TStringList.Create;
 Data1:=TMemoryStream.Create;
 Tools.FileSearcher('d:\Документация',Files,'*.dj*',False,True,True);
 repeat
  x:=Random(Files.Count);
  DebugWrite(Files[x]);

  try
   WriteLog(Files[x]);
   SPFilter.GetFileContentsFromIFilter(Files[x],Data1);
  except
   on e: Exception do
    WriteLog('Exception '+e.Message+#32+'('+Files[x]+')');
  end;

  if Data1.Size>0 then Write(':') else Write('.');
  DebugWrite(Tools.BytesToStr(Data1.Size));
  Data1.Clear;
 until 1=2;
 Data1.Free;
 ReadLN;
end.
253
15 марта 2010 года
Proger_XP
1.5K / / 07.08.2004
И что это даёт?
402
15 марта 2010 года
ToRNaDo
70 / / 27.01.2004
Ну, ты сам описывал, зачем нужны минимальные приложения...

Если я правильно понял, есть файлы, которые неверно обрабатываются библиотекой и на них программа виснет. Проблема где-то в коде обработки ошибок в библиотеке LTIFilter.DLL.
253
15 марта 2010 года
Proger_XP
1.5K / / 07.08.2004
Цитата:
Ну, ты сам описывал, зачем нужны минимальные приложения...


Я не про то. Имелось в виду, каков результат его работы-то? Вылетает, виснет, работает нормально?

Цитата:
Если я правильно понял, есть файлы, которые неверно обрабатываются библиотекой и на них программа виснет.


О чём и речь. Прогони своё минимальное приложение на одном (нескольких) таких файлов и напиши, что вышло.

402
15 марта 2010 года
ToRNaDo
70 / / 27.01.2004
Результат я уже описывал чуть выше. Сообщение #25.
253
15 марта 2010 года
Proger_XP
1.5K / / 07.08.2004
Блин... *wall*

1. Имеем минимальную прогу.
2. Имеем список файлов, которые неправильно обрабатываются.
3. Передаём один из них их минимальной проге.
4. Минимальная прога вылетает?

В #23 говорится о списке неправильно обрабатываемых файлов, но не говорится о том, чем они обрабатывались - вашим web crawler'ом или кодом что парой постов выше.

Я просто пытаюсь прояснить вопрос.
402
15 марта 2010 года
ToRNaDo
70 / / 27.01.2004
Минимальная прога при обработке выводит на экран ошибки. НО!
Каким образом она выводит на экран, если до моих процедур обработки исключений дело не доходит?

При использовании функций writeln() в не-консольном приложении программа виснет.
Может быть и тут происходит нечто подобное?
253
16 марта 2010 года
Proger_XP
1.5K / / 07.08.2004
Цитата:
Минимальная прога при обработке выводит на экран ошибки.


Какие? Может это нормальные (штатные) ошибки?

Цитата:
Каким образом она выводит на экран, если до моих процедур обработки исключений дело не доходит?


writeln, видимо. Другое дело, что очень странно, что подобные функции используются в официальном фильтре. А эта SPFilter.GetFileContentsFromIFilter - стандартная функция/юнит?

Кстати, под минимальной прогой я понимал ещё меньшую. Грубо говоря: ifilter.create; ifilter.openfile('a file.djvu'); ifilter.free; - без всяких Tools и пр.

402
16 марта 2010 года
ToRNaDo
70 / / 27.01.2004
Цитата: Proger_XP
А эта SPFilter.GetFileContentsFromIFilter - стандартная функция/юнит?



Нет, это юнит, который я нашёл где-то на просторах сети и доделал.
Могу выложить, ничего секретного там нет.

Если отключить обработку DjVu-файлов, или просто удалить LTIFilter.dll,
то программа индексирует 20000 файлов формата PDF и ещё кучу документов
Microsoft Word через другие IFilter без единой ошибки.

253
16 марта 2010 года
Proger_XP
1.5K / / 07.08.2004
Цитата:
Нет, это юнит, который я нашёл где-то на просторах сети и доделал.


Основная идея, которую я пытаюсь донести, такая - если есть фильтр в виде одной длл или юнита, то нужно составить самую минимальную прогу и ободрать загрузку/обработку файла в проге до костей.
Иными словами, без всяких SPFilter и прочих полезностей - в идеале вообще должны остаться только 3-4 вызова функций фильтра.
Я не знаю, как устроен djvu-фильтр, но надеюсь что ты сможешь для этого использовать самую минимальную его часть.
Тогда проще будет отлаживать.

402
12 июня 2010 года
ToRNaDo
70 / / 27.01.2004
В начале кода инициализации фильтра добавил строчку
CoInitialize(nil);
в конце процедуры добавил
CoUninitialize;

Выгрузку библиотек вообще закоментировал.
// DLLHandle := GetModuleHandleA(PAnsiChar(FilterDLL));
// if (DLLHandle>=32) then
// FreeLibrary(DLLHandle);
402
16 июня 2010 года
ToRNaDo
70 / / 27.01.2004
Забил на прямой вызов библиотек фильтров, переделал всё через библиотеку QUERY.DLL и её процедуру LoadIFilter. Работает! Вот только память жрёт гигабайтами... где-то утечка, наверное.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог