![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Так, а если общение через интерфейс, но интерфейс в DLL? [D7, WinXP]
Mx © (2005-08-05 12:20:00)Нужен ли тогда ShareMem? Допустим загружаем DLL, а она экспортирует функцию для создания объекта, с которым потом общаемся через интерфейс (объект не COM, но интерфейс реализует, как IDesigner в Delphi). Будут ли проблемы со string'ами (не бельем, естественно)?
Mx (2005-08-06 20:17:00) [1]
> Бурундук © (06.08.05 16:34) [32]
Спасибо за ссылку! Действительно, если произвести инициализацию в операторе var, то объект все-таки разрушается по завершении. Впредь буду знать.
Бурундук (2005-08-06 16:34:00) [2]Кстати, советую почитать
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=759
(+ комментарии)
Mx (2005-08-05 21:59:00) [3]Значит [26] все-таки не совсем корректен. Я так и не понял почему в случае с формой разрушение происходит корректно? Какие есть соображения?
Digitman (2005-08-05 18:22:00) [4]дело в том что в методе TInterfacedObject.AfterConstruction() сч-к ссылок увеличивается на единицу, после чего (в момент запроса у этого объекта интерфейса и возврата его в кач-ве результата работы ф-ции CreateAppObject) для использования в WITH сч-к увеличивается еще на единицу
т.е. в варианте
with CreateAppObject do begin
messagebox(0, pchar(inttostr(getrefcount)), '', mb_ok or mb_setforeground);
//<- RefCount = 1 ! нужен вызов _release;
end;
объект не будет разрушен
а в варианте
messagebox(0, pchar(inttostr(CreateAppObject. getrefcount)), '', mb_ok or mb_setforeground);
все будет в порядке - объект будет успешно уничтожен
Digitman (2005-08-05 17:50:00) [5]точнее RefCount > 1
Digitman (2005-08-05 17:49:00) [6]потому что RefCount > 0 на этот момент
Mx (2005-08-05 17:17:00) [7]
> Digitman © (05.08.05 17:10) [26]
Прикол в том, что и так не работает! Я именно такую конструкцию применил в самый первый раз. Никакого деструктора не вызывается.
Digitman (2005-08-05 17:10:00) [8]
> ведь не всегда у нас код ограничен одним методом
да, не всегда.
но всегда можно найти решение ...
например, в дан.случае можно не заводить статическую переменную вообще, можно сделать так :
begin
with CreateAppObject do
try
...
except
on E: Exception do
WriteLn(...);
end;
//<- здесь объект уже неявно уничтожен
..
end.
Mx (2005-08-05 16:56:00) [9]
> Digitman © (05.08.05 16:51) [24]
Привычку такую я со всем динамическим завел. Но ведь не всегда у нас код ограничен одним методом, верно. Сделаю явное присваивание. Все-равно, это отладочная прога.
Digitman (2005-08-05 16:51:00) [10]
> Mx © (05.08.05 16:40) [23]
> можно не поймать
да, в ряде случаев можно и не поймать
просто заведи себе хорошую и полезную привычку оформлять код , работающий с интерф.объектами, след.образом
App := CreateAppObject;
try
.. поработали с App ..
finally
App := nil; //безусловно уничтожили
end;
и все недоразумения сразу исчезнут
Mx (2005-08-05 16:40:00) [11]
> Digitman © (05.08.05 16:38) [22]
Вначале поставил breakpoint, но потом подумал раз приложение закрывается можно не поймать. Тады сделал ShellExecute на web-страницу. Не сработало. Если явно App := nil, то все естественно ok.
Digitman (2005-08-05 16:38:00) [12]а ты что, брейпойнт в тело деструктора ставил ? и вроде бы как не поймал этот брейкпойнт при закрытии приложения ?
или как ты это пытался определить ?
Mx (2005-08-05 16:36:00) [13]
> Digitman © (05.08.05 16:34) [19]
Но деструктор-то не выполняется, а в случае с GUI выполняется. Почему?
Digitman (2005-08-05 16:36:00) [14]
> вроде как счетчик ссылок при выходе должен был сам на нуль
> свалить
он и "свалил" ... в ходе исполнения неявного кода, который скрывается за последним оператором программы END.
Digitman (2005-08-05 16:34:00) [15]
> когда приложение закрывается процесс таки завершается
так точно.
а раз завершается, то при этом немедленно и безусловно прекращают существование ВСЕ объекты, существовавшие когда-либо при "жизни" процесса в ЕГО контексте, в ЕГО адресном пространстве
и при этом неважно какой был процесс - консольный или GUI или сервис ..
Mx (2005-08-05 16:28:00) [16]
> Digitman © (05.08.05 16:04) [17]
> время жизни переменной Арр равно времени жизни процесса
Это так, безусловно! Но когда приложение закрывается процесс таки завершается (правда тут Windows рулит, а не RTL, понимаю). Я хоче понять почему в случае с формой такого не было? Может ввиду ее явного разрушения в деструкторе Application?
Digitman (2005-08-05 16:04:00) [17]
> Mx © (05.08.05 15:50) [14]
ты его нигде не разрушаешь, вот он и не разрушается у тебя.
время жизни переменной Арр равно времени жизни процесса, и все это время интерфейсная ссылка, которую ты получил, "живет" в этой переменной
GLFox (2005-08-05 16:01:00) [18]>Mx © (05.08.05 15:54) [15]
>> Alexander Panov © (05.08.05 15:50) [13]
>> А в какой момент он должен быть у тебя разрушен?
>Я так понимаю, когда приложение закрывается.
Когда приложение закрывается винда и так уничтожит все связанные с ним ресурсы.
А вообще, рекомендую почитать книгу Эрика Хармона "Разработка COM-приложений в среде Delphi". Книга хоть и не новая, но про интерфесы там весьма доходчиво написано.
Mx (2005-08-05 15:54:00) [19]
> Alexander Panov © (05.08.05 15:50) [13]
> А в какой момент он должен быть у тебя разрушен?
Я так понимаю, когда приложение закрывается. Ну, например, как с дин. массивами. Еще раз пересмотрел свой старый GUI проект, там такой объект (правда не из DLL сконструированный) записывается в поле формы в ее конструкторе. Разрушается он самостоятельно, никаких nil ему не присваивается.
Mx (2005-08-05 15:50:00) [20]
> GLFox © (05.08.05 15:46) [12]
Так пробовал - работает. Но почему автоматом этого не происходит? В GUI такого не было. Неужели в чем-то различие? Или я что-то упустил?