-
С помощью внутрипроцессорного COM-объекта создаю форму. Нужно ли явно вызывать Free при закрытии этой формы либо приложения?
-
> С помощью .. COM-объекта создаю форму
Что после этого происходит с COM-объектом ?
-
Ничего больше. Из главной формы посылается запрос на создание модальной формы COM-объекту [Application.CreateForm(TForm,CreForm);]. Далее происходит некая работа пользователя с формой и её закрытие. Возможен вызов нескольких форм по очереди. Освобождать ресурсы надо ли? В каком месте? В OnClose формы? Или за этим следит сам COM?
-
> Ничего больше
Что, так и висит после этого "мертвым грузом" ?
-
> Den303 © (29.08.07 10:11) [2]
Сопс-на, сорри. Происходит различная обработка действий на созданной форме и передача результатов в приложение. После её закрытия форма не нужна, соотв и COM-объект не нужен. Он уничтожается сам? Ссылок вроде после закрытия формы нет. Или надо явно освободить?
-
> Он уничтожается сам?
Это у тебя надо спросить)
COM-объект уничтожается после того как его внутренний сч-к ссылок становится равным нулю.
> После её закрытия форма не нужна
Тогда есть резон обработать OnClose с Action = caFree.
Если у COM-объекта нет никаких "завязок" с созданной им формой, все должно пройти корректно.
-
> COM-объект уничтожается после того как его внутренний сч-
> к ссылок становится равным нулю.
Как можно проверить этот счётчик?
-
> Как можно проверить этот счётчик?
Считай что никак, если объект не твоей разработки.
Да и нет необходимости его проверять - нужно просто четко представлять себе, при каких твоих программных условиях и действиях происходит инкремент/декремент этого сч-ка.
-
Объект моей разработки :o)
Нужно во время разработки проследить за этим счётчиком. Как?
_AddRef и _Release знаю, а как увидеть их результаты....
-
Action:=caFree проходит успешно. Значит ли это, что память, занятая под COM-объектом, освобождена, при условии, что, кроме формы, объектов в COM нет?
-
> Нужно во время разработки проследить за этим счётчиком.
> Как?
При использовании готового стандартного класса TComObject это довольно хлопотно.
Проще запомнить условия модификации сч-ка.
1. Инкремент происходит при:
- создании объекта
- копировании значения переменной, содержащей ссылку на существующий интерф.объект, в другую переменную (т.е. копировании интерфейса)
2. Декремент происходит при:
- явном присвоении переменной, содержащей ссылку на существующий интерф.объект, значения nil (если перем-я интерф.типа) или Null/Empty/Unassigned (если перем-я вариантного типа)
- время жизни переменной закончилось.
-
> Значит ли это, что память, занятая под COM-объектом, освобождена
Нет, не значит.
-
если форма представлена переменной интерфейсного типа и в коде нигде явно не вызывается _AddRef и _Release (а если вызывается, то осознанно), то проблем быть не должно и явно освобождать ничего не надо. Основное правило примерно такое: если вы присваиваете ссылку на COM-объект переменной, то счетчик увеличивается. Если переменная уходит из области видимости или Вы явно присваиваете ей nil - счетчик уменьшается. Как только счетчик станет равным нулю, форма будет уничтожена (будет вызван ее деструктор).
-
> Сергей М. © (29.08.07 11:07) [10]
Огромное спасибо! Разобрался... пока что :o)
-
> umbra © (29.08.07 11:08) [12]
TNX и Вам!
Раньше с COM'ом не работал, непривычно немного против VCL... Объекты сами освобождаются..... :o)