Текущий архив: 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.47 MB
Время: 0.047 c