Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 FDEventAlerter.Options.Synchronize в консольном прилож и dll - могут ли быть тут проблемы?  [new]
Devillio
Member

Откуда: Волгоград
Сообщений: 267
Добрый день!

Помогите найти причину Access Violation?
Поясню непонятное название темы )
Набросал небольшую утилиту к базе данных, которая формирует rtf-документы.
Смысл ее в том, что она слушает Events от FB, когда получает, читает таблицу очереди, и формирует ожидаемые документы.
Программка консольная, x64, стоит на сервере. Если ее запустить, то она сразу сама читает очередь (без FDEventAlerter.OnAlert).
Чтобы срабатывал OnAlert, поменял Options.Synchronize у FDEventAlerter в False;
Для некоторых типов все заработало, она получает команду, создает файлы, сохраняет их в базу, все отлично.
Для следующего типа понадобилось склонять ФИО и должности (через PadegUC.dll).
И, в общем, столкнулся, что если программа читает таблицу очереди и формирует документы при своем запуске (а не по команде OnAlert), то документ формируется (ФИО и должность склоняются).
А если команда приходит в уже работающее приложение через OnAlert, то в момент вызова функции из dll происходит Acess Violation.
Больше ни в чем, кроме способа вызова, разницы не вижу.
Если я в правильном направлении думаю, подскажите, как организовать безглючную работу?

Спасибо!

+ Основной текст, так сказать
    DllHandle := LoadLibrary(PChar(ExtractFileDir(ParamStr(0))+'\PadegUC.dll')); 
    if DllHandle <> 0 then
    begin
      @GetPadeg := GetProcAddress(DllHandle, 'GetFIOPadegFSAS');
      @GetAppPadeg := GetProcAddress(DllHandle, 'GetAppointmentPadeg');
    end



class procedure TEventActions.FDAlerterAlert(ASender: TFDCustomEventAlerter;
  const AEventName: string; const AArgument: Variant);
begin
  //
  if AEventName = 'CONSTRUCTRTF' then
  begin
    while WeOnProcess do Sleep(10); //вдруг уже формируем

    WriteColoredStr('['+DateTimeToStr(Date+Time)+'] ', [], 7);
    WriteColoredStr('Получена команда формирования RTF, читаю очередь:%s', [#13#10], 3);
    ProcessQueue(False);
  end;

end;


    FIO := FDTQ2.FieldByName('FIO').AsString;
          nLen := Length(FIO) + 10;
          pResult := StrAlloc(nLen);
          try
            r := GetPadeg(PChar(FIO), 3, pResult, nLen); //вот тут вылетаем AccessViolation at address 000000000000
            if r = 0 then S := StrPas(pResult)
            else S := FIO;  
          finally
            StrDispose(pResult);
          end;
9 июл 18, 16:02    [21556764]     Ответить | Цитировать Сообщить модератору
 Re: FDEventAlerter.Options.Synchronize в консольном прилож и dll - могут ли быть тут проблемы?  [new]
Devillio
Member

Откуда: Волгоград
Сообщений: 267
Блин, а файрбердовский padegfb.dll рушит FB ((
то срабатывает, а то бац:

SERVER Mon Jul 09 16:27:02 2018
The user defined function: GETAPPOINTMENTPADEG
referencing entrypoint: GetAppointmentPadeg
in module: PadegFB
caused the fatal exception: Access violation.
The code attempted to access a virtual
address without privilege to do so.
This exception will cause the Firebird server
to terminate abnormally.


SERVER Mon Jul 09 16:29:59 2018
The user defined function: GETAPPOINTMENTPADEG
referencing entrypoint: GetAppointmentPadeg
in module: PadegFB
caused the fatal exception: Access violation.
The code attempted to access a virtual
address without privilege to do so.
This exception will cause the Firebird server
to terminate abnormally.


и как теперь склоняться ))
9 июл 18, 16:37    [21556888]     Ответить | Цитировать Сообщить модератору
 Re: FDEventAlerter.Options.Synchronize в консольном прилож и dll - могут ли быть тут проблемы?  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10492
Devillio
и как теперь склоняться ))
Брать исходники и смотреть
9 июл 18, 18:00    [21557247]     Ответить | Цитировать Сообщить модератору
 Re: FDEventAlerter.Options.Synchronize в консольном прилож и dll - могут ли быть тут проблемы?  [new]
Василий 2
Member

Откуда:
Сообщений: 192
Приложение что-то делает в ожидании события или просто ждет? Потому что фоновый поток с Synchronize (на чем сделан FDEventAlerter) на консольном приложении это уже достаточно стремная штука.
9 июл 18, 18:28    [21557368]     Ответить | Цитировать Сообщить модератору
 Re: FDEventAlerter.Options.Synchronize в консольном прилож и dll - могут ли быть тут проблемы?  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 3267
Devillio,

смотрите CheckSynchronize в System.Classes

  • если synchronize вызывается в фоновом потоке dll, то естественно dll-ка и апликуха должна быть собрана с пакетами
  • если делать консоль, то кто-то должен вызывать CheckSynchronize


    да, безобразная реализация, но вам с этим жить
  • 9 июл 18, 20:07    [21557590]     Ответить | Цитировать Сообщить модератору
     Re: FDEventAlerter.Options.Synchronize в консольном прилож и dll - могут ли быть тут проблемы?  [new]
    kdv
    Member

    Откуда: iBase.ru
    Сообщений: 27443
    Devillio
    а файрбердовский padegfb.dll рушит FB

    у Firebird нет никакого pagegfb.dll. Это какая-то самописная либа. И если она криво написана, то да, будет рушить любой exe, который ее вызывает.
    10 июл 18, 21:31    [21560492]     Ответить | Цитировать Сообщить модератору
     Re: FDEventAlerter.Options.Synchronize в консольном прилож и dll - могут ли быть тут проблемы?  [new]
    YuRock
    Member

    Откуда: Донецк
    Сообщений: 3527
    kealon(Ruslan)
    если synchronize вызывается в фоновом потоке dll, то естественно dll-ка и апликуха должна быть собрана с пакетами
    если в "чистом" dll - то вообще будет зависон всегда. Только в BPL есть шансы, что сработает.
    10 июл 18, 21:58    [21560565]     Ответить | Цитировать Сообщить модератору
     Re: FDEventAlerter.Options.Synchronize в консольном прилож и dll - могут ли быть тут проблемы?  [new]
    Василий 2
    Member

    Откуда:
    Сообщений: 192
    Из DLL вызывается только функция, никаких фоновых потоков там нет, насколько я понял.
    11 июл 18, 09:39    [21561291]     Ответить | Цитировать Сообщить модератору
    Все форумы / Delphi Ответить