Здравствуйте 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-ы это не лучший выбор...