Конференция "Основная" » InterBase и FreeLibrary
 
  • asafr (04.07.08 15:42) [0]
    Существует DLL, взаимодействующая с интербейзом... DLL подключается динамически из основной программы и имеет модальную форму... В случае, если в запросе DLL к IB происходит ошибка - генерируется исключение, выдается предупреждение об ошибке, DLL завершает работу по Exception... Далее, главная программа после завершения работы библиотеки доходит до фунуции FreeLibrary(hndl) - и намертво виснет...  
    Если же исключение в библиотеке генерируется не в результате ошибки запроса, а по другой причине - FreeLibrary в главной программе отрабатывает корректно.
    Понятно, что скорее всего какой-то "хвост" остается от связки DLL-IB, который не дает выгрузить библиотеку из памяти. Но какой?
    Операционная система WinXP Sp2
                                    Delphi 2007
    Код библиотеки в очень сильно упрощенном виде выглядит так:

    ..............................................
    var  _HandleOwnerApp     :THandle;
    .............................................
    ..............................................

    procedure DllMain(fdwReason:DWORD);
    begin
      case fdwReason of
        DLL_THREAD_ATTACH: ;
        DLL_THREAD_DETACH: ;
        DLL_PROCESS_ATTACH: begin
                                         ....................
                                         ...................
                                         CoInitialize(nil);
                                         end;
        DLL_PROCESS_DETACH: begin
                                         DModule.IBDB.Close;
                                         DModule.Free;
                                         CoUnInitialize;
                                         end;
      end;
    end;

    function ShowRep(DVar:Variant):Variant; StdCall;
    var ...................
        ....................
    begin
       _HandleOwnerApp := Application.Handle;
        Application.Handle := DVar[0]; //HandleCallApp;
        if not Assigned(DModule) then DModule := TDModule.Create(DModule);
        DModule.IBDB.DatabaseName := DVar[2]; //ConnectionString IBDataBase
        ...........................................................
       ...........................................................
        with TfmListReports.Create(nil)  do
        begin
          try
            .................................
            ..................................

            if ShowModal = mrOK then
            begin
              .....................
              .......................
              Query.Open; //Запрос с ошибкой
              ........................
              ........................
              Free;
              DModule.IBDB.Close;
              DModule.Free;
              Result := VarArrayOf([1,null,null]);
            end;            
          except
            on E:Exception do
            begin
              CreateDialog('Ошибка!', E.Message , mtError, [mbYes], poOwnerFormCenter);
              Result := VarArrayOf([0,null,null]);
              Free;
              DModule.IBDB.Close;
              DModule.Free;
              CoUnInitialize;
            end;
          end;
        end;
    end;

    exports ShowRep;

    begin
    DllProc := @DllMain;
    DllMain(DLL_PROCESS_ATTACH);
    end.



    На самом деле, буду рад любому совету, который хотя бы даст направление в поисках решения этой проблемы.
    Заранее спасибо.
  • Sashka (04.07.08 15:54) [1]
    except
           on E:Exception do
           begin
             CreateDialog('Ошибка!', E.Message , mtError, [mbYes], poOwnerFormCenter);
             Result := VarArrayOf([0,null,null]);
             Free;
             DModule.IBDB.Close;
            DModule.Free;
             CoUnInitialize;
           end;
         end;

    DLL_PROCESS_DETACH: begin
                                        DModule.IBDB.Close;
                                        DModule.Free;
                                        CoUnInitialize;
                                        end;
  • Сергей М. © (04.07.08 15:59) [2]
    Жуткая каша)..

    Уже язык отсох спрашивать - зачем тут stdcall ?
  • asafr (04.07.08 16:08) [3]
    Sashka, то, что выделил мне жирным - не влияет на суть проблемы..
    На самом деле в exception в программе
    строки
    DModule.IBDB.Close;
    DModule.Free  - отсутствуют. Просто в форуме не очень удобно писать код... Как они там очутились в коде поста - самому не понятно!  :)
    Сергей М., мудрый человечище, так  подскажи! Авось, язык не отсохнет..
    На этом форуме я посетитель редкий и частым быть не собираюсь - поэтому следить за твоими ответами - мне нет ни силЮ ни времени: очень много работы..
  • Сергей М. © (04.07.08 16:13) [4]

    > подскажи!


    Сначала скажи, откуда и зачем оно у тебя взялось ..


    > не влияет на суть проблемы


    Еще как влияет)
  • Сергей М. © (04.07.08 16:14) [5]

    > Как они там очутились в коде поста - самому не понятно


    Равно как ни тебе ни нам непонятно и появление stdcall)
  • asafr (04.07.08 16:21) [6]
    stdcall - ключевое слово. Благодаря нему, вместо боллее эффективной методики передачи параметров, используемой Delphi по умолчанию (ключевое слово register), используется методика передачи параметров, применяемая в Win32. stdcall - можно не применять, если обращение к библиотеке происходит из приложения, написанного на Delphi. Тебе это объяснить?
  • asafr (04.07.08 16:22) [7]
    Кстати, при работе аналогичной библиотеки с MS SQL Server - подобной проблемы при ошибке запроса не возникает....
  • Сергей М. © (04.07.08 16:31) [8]

    > stdcall - можно не применять, если обращение к библиотеке
    > происходит из приложения, написанного на Delphi


    А зачем же тогда применяешь ? Тем более если Pascal fastcall более эффективно ?
  • Сергей М. © (04.07.08 16:33) [9]
    И - уж сколько раз твердили миру  - дельфийским формам не место в dll, для них придуманы bpl !
  • asafr (04.07.08 16:45) [10]
    :)
    Спасибо, Сергей М.! А знаешь, что есть такие понятия, как "техническое задание" и "пожелания заказчика"? А так же, сложившийся исторически процесс написания проекта, которому уже несколько лет и где модульность поддерживается с помощью DLL..
    А так должна быть предусмотрена возможность вызова библиотеки не только из Дельфовых приложений, но из приложения, написанных на C++ и VB? Видимо, не слышал.. Или не приходилось работать в таких организациях, между прочим - весьма серьезных.. Cразу все вешаешь на свою колокольню.
    Как я понял - по сути вопроса ответа ты мне дать не можешь...
    Но не переживай - многие не могут. В различных форумах встречаются вопросы по этой проблеме (не только Дельфийские форумы) - но с ответами там туго...
  • Sashka (04.07.08 16:50) [11]

    > На самом деле в exception в программе
    > строки
    > DModule.IBDB.Close;
    > DModule.Free  - отсутствуют. Просто в форуме не очень удобно
    > писать код... Как они там очутились в коде поста - самому
    > не понятно!  :)


    )) Зачет

    А Эксепшен то (не интербейзовский) в том же куске кода-то хоть генерируется тоже???
  • asafr (04.07.08 16:53) [12]
    а как же?
  • asafr (04.07.08 16:54) [13]
    Ладно.. Тема закрыта... Буду "рыть" сам.. Спасибо за посильную помощь...
  • Сергей М. © (04.07.08 16:55) [14]

    > должна быть предусмотрена возможность вызова библиотеки
    > не только из Дельфовых приложений, но из приложения, написанных
    > на C++ и VB? Видимо, не слышал


    Я-то слышал.

    А вот ты , видимо, не слышал, что, к примеру, дельфийский тип Variant не совместим с одноименным типом в VB. А ты этот тип ничтоже сумняшеся тычешь параметром и результатом своей функции.
    Кр.того, нет никакой гарантии, что твой код будет работать, если тебе передадут параметром хэндл окна недельфийского приложения.

    Вот тебе и "по сути")
  • Сергей М. © (04.07.08 16:57) [15]
    А вот тебе еще грабли - ты не придаешь НИКАКОГО значения тому. в КАКОМ кодовом потоке хост-процесса будет инициализирована твоя билиотека и в каком потоке вызвана твоя ф-ция в ее составе.
  • Сергей М. © (04.07.08 16:58) [16]
    Так что текущие грабли - это только грабельки.
    А граблища у тебя еще впереди)
  • Сергей М. © (04.07.08 17:01) [17]

    > очень много работы


    Что, и на изучение возможностей встр.отладчика времени не хватает ? Или желания ?)

    Ведь место "виса" с его помощью выясняется самостоятельно и элементарно)
  • asafr (05.07.08 01:31) [18]
    Удалено модератором
Есть новые Нет новых   [134435   +4][b:0][p:0.002]