Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.04.02;
Скачать: [xml.tar.bz2];

Вниз

Зависает программа при выгрузке 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.034 c
15-1142126083
phantasmagoria.ru
2006-03-12 04:14
2006.04.02
дизайн, программирование, www.phantasmagoria.ru


15-1142323371
vajo
2006-03-14 11:02
2006.04.02
Затопили соседи


15-1141897687
iamdanil
2006-03-09 12:48
2006.04.02
PATH environment variable


2-1142724038
ga3
2006-03-19 02:20
2006.04.02
проблема с ActiveX dll


15-1141973153
Аноним
2006-03-10 09:45
2006.04.02
Создание wizard - ов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский