Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Так, а если общение через интерфейс, но интерфейс в DLL? [D7, WinXP]


Страницы:   1 2

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 такого не было. Неужели в чем-то различие? Или я что-то упустил?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо