Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.09.20;
Скачать: CL | DM;

Вниз

InterBase и FreeLibrary   Найти похожие ветки 

 
asafr   (2008-07-04 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   (2008-07-04 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;


 
Сергей М. ©   (2008-07-04 15:59) [2]

Жуткая каша)..

Уже язык отсох спрашивать - зачем тут stdcall ?


 
asafr   (2008-07-04 16:08) [3]

Sashka, то, что выделил мне жирным - не влияет на суть проблемы..
На самом деле в exception в программе
строки
DModule.IBDB.Close;
DModule.Free  - отсутствуют. Просто в форуме не очень удобно писать код... Как они там очутились в коде поста - самому не понятно!  :)
Сергей М., мудрый человечище, так  подскажи! Авось, язык не отсохнет..
На этом форуме я посетитель редкий и частым быть не собираюсь - поэтому следить за твоими ответами - мне нет ни силЮ ни времени: очень много работы..


 
Сергей М. ©   (2008-07-04 16:13) [4]


> подскажи!


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


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


Еще как влияет)


 
Сергей М. ©   (2008-07-04 16:14) [5]


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


Равно как ни тебе ни нам непонятно и появление stdcall)


 
asafr   (2008-07-04 16:21) [6]

stdcall - ключевое слово. Благодаря нему, вместо боллее эффективной методики передачи параметров, используемой Delphi по умолчанию (ключевое слово register), используется методика передачи параметров, применяемая в Win32. stdcall - можно не применять, если обращение к библиотеке происходит из приложения, написанного на Delphi. Тебе это объяснить?


 
asafr   (2008-07-04 16:22) [7]

Кстати, при работе аналогичной библиотеки с MS SQL Server - подобной проблемы при ошибке запроса не возникает....


 
Сергей М. ©   (2008-07-04 16:31) [8]


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


А зачем же тогда применяешь ? Тем более если Pascal fastcall более эффективно ?


 
Сергей М. ©   (2008-07-04 16:33) [9]

И - уж сколько раз твердили миру  - дельфийским формам не место в dll, для них придуманы bpl !


 
asafr   (2008-07-04 16:45) [10]

:)
Спасибо, Сергей М.! А знаешь, что есть такие понятия, как "техническое задание" и "пожелания заказчика"? А так же, сложившийся исторически процесс написания проекта, которому уже несколько лет и где модульность поддерживается с помощью DLL..
А так должна быть предусмотрена возможность вызова библиотеки не только из Дельфовых приложений, но из приложения, написанных на C++ и VB? Видимо, не слышал.. Или не приходилось работать в таких организациях, между прочим - весьма серьезных.. Cразу все вешаешь на свою колокольню.
Как я понял - по сути вопроса ответа ты мне дать не можешь...
Но не переживай - многие не могут. В различных форумах встречаются вопросы по этой проблеме (не только Дельфийские форумы) - но с ответами там туго...


 
Sashka   (2008-07-04 16:50) [11]


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


)) Зачет

А Эксепшен то (не интербейзовский) в том же куске кода-то хоть генерируется тоже???


 
asafr   (2008-07-04 16:53) [12]

а как же?


 
asafr   (2008-07-04 16:54) [13]

Ладно.. Тема закрыта... Буду "рыть" сам.. Спасибо за посильную помощь...


 
Сергей М. ©   (2008-07-04 16:55) [14]


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


Я-то слышал.

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

Вот тебе и "по сути")


 
Сергей М. ©   (2008-07-04 16:57) [15]

А вот тебе еще грабли - ты не придаешь НИКАКОГО значения тому. в КАКОМ кодовом потоке хост-процесса будет инициализирована твоя билиотека и в каком потоке вызвана твоя ф-ция в ее составе.


 
Сергей М. ©   (2008-07-04 16:58) [16]

Так что текущие грабли - это только грабельки.
А граблища у тебя еще впереди)


 
Сергей М. ©   (2008-07-04 17:01) [17]


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


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

Ведь место "виса" с его помощью выясняется самостоятельно и элементарно)


 
asafr   (2008-07-05 01:31) [18]

Удалено модератором



Страницы: 1 вся ветка

Текущий архив: 2009.09.20;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.013 c
15-1248346808
Наиль
2009-07-23 15:00
2009.09.20
Новое десятитысячелетие


2-1247658555
b/@.
2009-07-15 15:49
2009.09.20
Можно ли поместить на форме графикс поверх винконтрол ?


15-1248119778
DVM
2009-07-20 23:56
2009.09.20
Вопрос по препроцессору С


1-1215704618
badevlad
2008-07-10 19:43
2009.09.20
Список Keyword ов из CHM-help файла


3-1227276494
Zemen
2008-11-21 17:08
2009.09.20
Объясните тонконсти хранения чисел