![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TIBataBase и DLL [D7, WinXP]
Maxick © (2008-03-13 08:55:00)Проблема следующего характера: Передовая в ДЛЛ данный объект и поимел проблему: при завершении приложения в главной форме не могу фрикнуть (DB.Free) объект DB=TIBDataBase. Вызывается исключение: Ошибка опирации с указателем. Соответственно, если мне не всвобождать DB (я ее создаю сам), то исключение: "приложение ххх.exe обратилось к адрессу хххх" и т.д.
Собственно вопрос: с чем это связано и как с тим бороться? Варианты типа "обработай сам это исключение" не хотелось бы слюшать.
Сергей М. (2008-03-13 11:05:00) [41]
> Прав?
Да.
> про дестрой - пробовал - неканает
Это же не редиска, чтобы "канать")
Maxick (2008-03-13 11:03:00) [42]
> Сергей М. © (13.03.08 10:37) [5]
Я так понял, вы про это:
"1. В исх.кодах своих exe- и dll-проектов убираешь все касаемое параметра Appl, т.е. передача этого параметра не нужна вообще.
2. Во всех своих проектах устанавливаешь крыжик
Project->Options..->Packages->Build With Run-Time Packages
и после этого полностью ребилдишь эти проекты.
Все !! Больше никаких телодвижений делать не нужно."
Прав?
А про Крейт - дошло :). А про дестрой - пробовал - неканает.
Сергей М. (2008-03-13 10:37:00) [43]
> и в событии OnClose главной формы
> db.free;
Разве это логично ?
Уж если объект создан тобой сразу после конструирования формы (OnCreate), то и уничтожать его, очевидно, следует непосредственно перед разрушением этой формы (OnDestroy).
> DB.Create(self);
А это что еще за фигня ?
Разве DB у тебя объявлен как TComponentClass ?
Сергей М. (2008-03-13 10:24:00) [44]
> Maxick
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1205238747&n=0
Maxick (2008-03-13 10:17:00) [45]забыл добавить, что при динамической загрузке длл также используется соглашение stdcall.
Maxick (2008-03-13 10:15:00) [46]IntruderLab, Можно будет и попробовать. Я так понимаю, при передачи объекта (указателя) в длл и происходитв вся эта бодяга. В длл у меня форма и работа с базой (таблицы и т.п.). Форма вызывается модально и после высвобождается, но хвост от TIBDataBase остается. Причем, это единственный обект с такой траблой на моей памяти.
Текст в длл:
function xxx(app:TApplication; db: TIBDataBase): boolean; stdcall;
var
hdll: TApplication;
begin
hdll:= application;
application:= app;
DataBase:= db;
fmForm:= TfmForm.Create(Application);
fmForm.ShowModal;
fmForm.Free;
application:= hdll;
Соответственно вызов:
...
DB.Create(self);
...
//тут динамическая загрузка длл
...
xxx(Application,db);
...
//и в событии OnClose главной формы
db.free;
Весь фокус еще в том, что если фрикать в процедуре (OnCreate главной формы), где создавалась db (там же и функцию из длл вызывать) то нет проблем совсем.
IntruderLab (2008-03-13 09:05:00) [47]как вариант используй CoInitialize() и CoUnInicialize(), ShareMem прописаны в главной форме и в dll