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

Вниз

Зависает программа при выгрузке DLL   Найти похожие ветки 

 
depo72 ©   (2006-03-14 23:00) [0]

Доброго времени суток!
Есть проект, из которого я хочу вызвать функцию из DLL. Динамически загружаю библиотеку по нажатию кнопки на форме, вызываю функцию. Все выполняется, но потом, при вызове FreeLibrary программа зависает. Для теста я создал простой проект с одной кнопкой - все работает. Подскажите, пожалуйста, где можно поискать проблему. Никаких ошибок не выдается.


 
balepa ©   (2006-03-15 05:42) [1]

Код бы привел

> Подскажите, пожалуйста, где можно поискать проблему.

Breakpoint"ы и анализ кода


 
depo72 ©   (2006-03-15 10:40) [2]


> Код бы привел


В DLL имеется следующая процедура:


procedure MyProc(AHandle:THandle;DataBase:TIBDataBase);
var
 frmUtils: TfrmUtils;
begin
 try
   Application.Handle:=AHandle;
   frmUtils:= TfrmUtils.Create(Application);
   try
     frmUtils.DataBase:=DataBase;
     frmUtils.ShowModal;
     frmUtils.DataBase:=Nil;
   finally
     frmUtils.Free;
   end;
 except
   on E:Exception do
     ShowMessage(E.Message);
 end;
end;


TfrmUtils - это форма, на которой расположены TIBTransaction, несколько TIBQuery, кнопки, чекбоксы и т.п. При нажатии кнопки "Выполнить" формируются определенные данные.

Функция вызывается следующим образом:

procedure TfrmTestPriUtils.Button1Click(Sender: TObject);
var
 DLLHandle:THandle;
 ExternalProc:procedure (AHandle:THandle;Database:TIBDatabase);
begin
 DLLHandle:=LoadLibrary("priutils.dll");
 if DLLHandle = 0 then
   raise Exception.Create("Невозможно загрузить библиотеку priutils.dll");
 try
   @ExternalProc:=GetProcAddress(DLLHandle,PChar("MyProc"));
   ExternalProc(Application.Handle,db1);
 finally
   FreeLibrary(DLLHandle);
 end;
end;



> Breakpoint"ы и анализ кода


Виснит именно на FreeLibrary. В простом проекте из одной формы все работает.   Может есть какие-нибудь "стандартные" причины, из-за которых библиотека может не выгружаться?


 
clickmaker ©   (2006-03-15 10:58) [3]

при нажатии кнопки Выполнить форма закрывается?


 
depo72 ©   (2006-03-15 11:17) [4]


> при нажатии кнопки Выполнить форма закрывается?


Нет. Закрывается при нажатии кнопки "Отмена" или на крестик.


 
clickmaker ©   (2006-03-15 11:34) [5]


> depo72 ©   (15.03.06 11:17) [4]

т.е. в момент вызова freelibrary форма может быть на экране?


 
depo72 ©   (2006-03-15 11:48) [6]


> т.е. в момент вызова freelibrary форма может быть на экране?

Нет, не может. Форма модальная. Я ее должен закрыть, после чего она (форма) уничтожается, а уж потом вызывается freelibrary.


 
clickmaker ©   (2006-03-15 11:54) [7]


> Application.Handle:=AHandle

кстати, рекомендую возвращать DLL ее хэндл в момент выгрузки


 
EvS   (2006-03-15 13:03) [8]

У тебя сразу после уничтожения формы идет выгрузка библиотеки. Может не все сообщения успевают обработаться. Попробуй перед FreeLibrary(DLLHandle) вставить
Application.ProcessMessage.


 
chelovek   (2006-03-15 14:22) [9]

depo72 ©   (15.03.06 10:40) [2]
procedure MyProc(AHandle:THandle;DataBase:TIBDataBase);

Лучше передавать указатель.

Раз вы выполняете Application.Handle:=AHandle; в библиотеке, то за вами остается и возврат DD(ский) хендл.
var
 DLLHandle: cardinal;
 ....
begin
DLLHandle := Application.Handle;
Application.Handle:=AHandle;
.....
Application.Handle := DLLHandle;
end;


Ну и напоследок, если не стоит цель создать универсальную DLL (если эти библиотеки только для вашего приложения), то вернее использовать bpl.
IMHO


 
depo72 ©   (2006-03-15 18:38) [10]

Application.ProgressMessage перед FreeLibrary не помогло. Хендл тоже вернул - лучше не стало.


> Лучше передавать указатель.


Это как? var Database:TIBDatabase? Или имеется ввиду что-то другое?


 
API ©   (2006-03-15 19:40) [11]


  <...>
 finally
   frmUtils.Release; // frmUtils.Free;
   // + желательно восстановить DLL Application.Handle, как в [9]
 end;


И


<...>
 finally
   Application.ProcessMessages;
   FreeLibrary(DLLHandle);
 end;



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

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

Наверх




Память: 0.49 MB
Время: 0.051 c
2-1142436458
ctudent
2006-03-15 18:27
2006.04.02
Помогите разобраться!


15-1141641390
Некто
2006-03-06 13:36
2006.04.02
Когда-то здесь было сообщение про crossover и FreeBSD


2-1142519958
vl
2006-03-16 17:39
2006.04.02
sql запрос


15-1142234746
Knight
2006-03-13 10:25
2006.04.02
Что надо для организации связи между двумя ЛВС на 600 метров?


15-1141972607
WondeRu
2006-03-10 09:36
2006.04.02
Рабство vs Армия