Здравствуйте, slava_529872, Вы писали:
_>Хочу научить внутренний (аггрегируемый) объект генерировать события внешнего. Использую MS VC++ 2003. _>Ничего пока не получается.
По-моему, аггрегированный объект ничего не знает о его использующем. Может, следует выбрасывать событие из какого-нибудь метода интерфейса внешнего объекта? То есть, в аггрегированном:
Здравствуйте, sakhnik, Вы писали:
S>По-моему, аггрегированный объект ничего не знает о его использующем. Может, следует выбрасывать событие из какого-нибудь метода интерфейса внешнего объекта? То есть, в аггрегированном: S>
Так у меня сейчас и сделано. Событие генерирует внешний кокласс по просьбе внутреннего
Но в моём случае набор событий строго ограничен и агрегируемый кокласс всё о них знает. Т.е. он как бы является базовым для постоения на его базе других. Т.е. базовый с логической точки зрения может сгенерить событие. Но кроме указателя на внешний IUnknown у него ничего нет. Есть ли какой нужный и полезный для этого случая интерфейс у класса публикующего события...?
Je vous remercie beaucoup, monsieur!
Re[3]: How to fire COM-event from aggregated coclass
Здравствуйте, slava_529872, Вы писали:
_>Так у меня сейчас и сделано. Событие генерирует внешний кокласс по просьбе внутреннего _>Но в моём случае набор событий строго ограничен и агрегируемый кокласс всё о них знает. Т.е. он как бы является базовым для постоения на его базе других. Т.е. базовый с логической точки зрения может сгенерить событие. Но кроме указателя на внешний IUnknown у него ничего нет. Есть ли какой нужный и полезный для этого случая интерфейс у класса публикующего события...?
Честно говоря, я не слышал о такой возможности, но это не значит, что её нет. Может, будет удобнее вынести выброс событий в аггрегируемый класс, а для приписки клиентов предоставить во внешнем возвращающее указатель на IUnknown аггрегируемого свойство?
>>Может, будет удобнее вынести выброс событий в аггрегируемый класс, а для приписки клиентов >>предоставить во внешнем возвращающее указатель на IUnknown аггрегируемого свойство?
Так, наверное не получится. Потому что IUnknown у клиента всегда должен быть один и тот же. Иначе нарушится базовый принцип СОМ. Клиент может из любого интерфейса получить любой другой посредством Queryinterface. И какими бы он путями не получал, результат должен быть одним и тем же.
Интересно как в микрософте заделали реалицацию евентов. Укого-нибудь есть полезная информация на этот счет?
Когда в коклассе с помощью ключевого слова __event вносятся поддерживаемые для этого кокласса события, автоматически студия при компиляции добавляет все нужные методы с сигнатурами, как в интерфейсе событий (мы потом вызываем эти методы, когда генерируем события с помощью __raise или вызова вручную). Так вот, теперь если добавить в карту поддерживаемых событий интерфейс событий — его можно будет получить через QueryInterface из агрегируемого кокласса (у него есть ссылка на внешний IUnknown).
Собственно и все. Вызывайте методы интерфейса событий из агрегируемого кокласса, а студия обеспечивает их имплементацию с помощью __event.