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

Ваш аккаунт

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

Последние темы форума

Показать новые сообщения »

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

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

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

400
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
======================================================

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


IFilter

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


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

400
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;


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

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

Это лечится?


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

400
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
Вы меня не поняли. Ждать. Новую версию. Можно даже авторам написать об ошибке - так они ее быстрее исправят и, след-но, быстрее появится новая версия.
400
01 апреля 2009 года
ToRNaDo
70 / / 27.01.2004
Мда... это была обычная алгоритмическая ошибка...
400
02 апреля 2009 года
ToRNaDo
70 / / 27.01.2004
Однако! Все равно лезут ошибки Access Violation!

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

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

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

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


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


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

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

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

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

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

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

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

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

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


<>

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


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

400
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


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

Чем меньше кода, тем лучше. Если прога будет по прежнему вешатся, тогда по крайней мере поймёшь, что ~50% где-то за ошибку в фильтре (другие 50 - за ошибку в твоём использовании его). Если же всё будет работать, то значит фильтр в порядке, и проблема где-то у тебя.
400
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.
252
15 марта 2010 года
Proger_XP
1.5K / / 07.08.2004
И что это даёт?
400
15 марта 2010 года
ToRNaDo
70 / / 27.01.2004
Ну, ты сам описывал, зачем нужны минимальные приложения...

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


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

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


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

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

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

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

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

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


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

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


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

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

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



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

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

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


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

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

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

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог