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

Ваш аккаунт

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

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

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

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

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

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

1.8K
25 марта 2009 года
ToRNaDo
69 / / 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
======================================================

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


IFilter

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


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

1.8K
26 марта 2009 года
ToRNaDo
69 / / 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;


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

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

Это лечится?


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

1.8K
31 марта 2009 года
ToRNaDo
69 / / 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
Вы меня не поняли. Ждать. Новую версию. Можно даже авторам написать об ошибке - так они ее быстрее исправят и, след-но, быстрее появится новая версия.
1.8K
01 апреля 2009 года
ToRNaDo
69 / / 27.01.2004
Мда... это была обычная алгоритмическая ошибка...
1.8K
02 апреля 2009 года
ToRNaDo
69 / / 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);
1.8K
03 апреля 2009 года
ToRNaDo
69 / / 27.01.2004
это для супер-параноиков:

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

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

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


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


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

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

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

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

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

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

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

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

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


<>

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


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

1.8K
15 марта 2010 года
ToRNaDo
69 / / 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


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

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

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


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

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


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

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

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

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

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

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


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

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


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

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

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



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

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

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


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

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

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

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

Ваш ответ

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