Косвенно-вызываемые интерфейсы
Опрос объекта IMouseAction WhereYouClicked()
Косвенно-вызываемый интерфейс IIngoing IveBeenClicked() IMouseEvents [ptrIMouseEvents]
Схема двустороннего обмена 1) Клиент реализует свой интерфейс (sink object) 2) При создании компонента указатель передается Коклассу 3) При событии, происходит вызов методов исходящего интерфейса
Последовательность двустороннего обмена CreateInstance() Release() Advise(pSinkIface) UnAdvise() FireEvent()ISink IIngoing
Архитектура соединяемых объектов КлиентСервер CPTwo CPOne IConnectionPointContainer ISomeCustomInterface _IOutBound
IConnectionPointContainer interface IConnectionPointContainer : IUnknown { //задай мне перечисление всех объектов точек соединения HRESULT EnumConnectionPoints ( [out] IEnumConnectionPoints ** ppEnum ); //Есть у вас такая-то точка соединения? HRESULT FindConnectionPoint ( [in] REFIID riid, [out] IConnectionPoint ** ppCP ); }
IEnumConnectionPoints interface IEnumConnectionPoints : IUnknown { HRESULT Next( [in] ULONG cConnections, [out, size_is(cConnections), length_is(*pcFetched)] LPCONNECTIONPOINT * ppCP, [out] ULONG * pcFetched ); HRESULT RemoteNext( [in] ULONG cConnections, [out, size_is(cConnections), length_is(*pcFetched)]LPCONNECTIONPOINT * ppCP, [out] ULONG * pcFetched ); HRESULT Skip( [in] ULONG cConnections ); HRESULT Reset( void ); HRESULT Clone( [out] IEnumConnectionPoints ** ppEnum ); }
IConnectionPoint interface IConnectionPoint : IUnknown { //получить GUID данного интерфейса HRESULT GetConnectionInterface([out] IID * pIID); //Получить IID контейнера, содержащего точку соединения HRESULT GetConnectionPointContainer( [out] IConnectionPointContainer ** ppCPC ); //Устанавливаем связь HRESULT Advise([in] IUnknown * pUnkSink,[out] DWORD * pdwCookie ); //Разъединяемся HRESULT Unadvise( [in] DWORD dwCookie ); //Какие еще клиенты подсоединены к этой точке? HRESULT EnumConnections( [out] IEnumConnections ** ppEnum ); }
IEnumConnections interface IEnumConnections : IUnknown { typedef struct tagCONNECTDATA { IUnknown * pUnk; DWORD dwCookie; } CONNECTDATA; HRESULT Next([in] ULONG cConnections, [out, size_is(cConnections), length_is(*pcFetched)] LPCONNECTDATA rgcd, [out] ULONG * pcFetched ); HRESULT RemoteNext([in] ULONG cConnections, [out, size_is(cConnections), length_is(*pcFetched)] LPCONNECTDATA rgcd, [out] ULONG * pcFetched); HRESULT Skip([in] ULONG cConnections); HRESULT Reset(void); HRESULT Clone([out] IEnumConnections ** ppEnum); }