Re: проблема с подсчётом ссылок у "клиента"
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.01.02 23:53
Оценка: 3 (1)
Здравствуйте Andy77, Вы писали:

A>имеем два компонента, размещенных на html-странице.

A>один из них, "клиент", слушает события "сервера".
A>при подсоединении клиента к серверу вызываем на клиенте
A>AtlAdvise; сервер, в свою очередь, вызывает AddRef у клиента;
A>мне же нужно, чтобы при закрытии окна IE убивался вначале
A>клиент, а потом (после AtlUnadvise) и сервер.
A>Сейчас никто не убивается, т.к. каждый держит ссылку на товарища

1. Самая красивая развязка такая:

В клиенте создается специальный объект (COM-объект или псевдо-COM-объект).
Псевдо в смысле, что ему понофункциональная реализация не нужна (его время жинни всегда меньше чем время жизни клиента, такая реализация может всегда вазвращать 2 на AddRef и Release, а QI возвращать указатель на this).

Именно к этому объекту и подключается сервер (этот объект передается в Advise).

Общение с родителем ведется через прямой указатель (С++-ый, без поддержки подсчета ссылок). При этом сервер будет AddRef-ить не клиента, а этот объект. Будит ли клиент AddRef-ить этот объект не важно. Далее клиент освобождает ссылку на север и тот отпускает промежуточный объект.


2. Если известен момент смерти клиента (например, у клиента уничтожаетя окно), то в этот момент он должен сделать Unadvise. Сервер осободит ссылку на клиента и тот благополучно скончается.


PS

Вообще IE и ActiveX-ы это не лучший выбор...
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.