Сущность технологии COM


         

Вместо этого идиома точек стыковки


Вместо этого идиома точек стыковки выражает общую концепцию регистрации экспортируемых интерфейсов как небольшого числа интерфейсов стандартной инфраструктуры. Наиболее фундаментальным из этих интерфейсов является IConnectionPoint:

[object, uuid(B196B286-BAB4-101A-B69C-00AA00341D07)] interface IConnectionPoint : IUnknown { // which type of interface can be connected // какой тип интерфейса можно присоединить HRESULT GetConnectionInterface( [out] IID * pIID); // get a pointer to identity of "real" object // получаем указатель на копию "реального" объекта HRESULT GetConnectionPointContainer([out] IConnectionPointContainer ** ppCPC); // hold and use pUnkSink until notified otherwise // сохраняем и используем pUnkSink, пока не объявлено другое HRESULT Advise([in] IUnknown * pUnkSink, [out] DWORD * pdwCookie); // stop holding/using the pointer associated with dwCookle // прекращаем хранение/использование указателя, связанного с dwCookie HRESULT Unadvise([in] DWORD dwCookie); // get information about currently held pointers // получаем информацию об имеющихся в данный момент указателях HRESULT EnumConnections([out] IEnumConnections ** ppEnum); }

Как показано на рис. 7.9, объекты представляют отдельную реализацию этого интерфейса каждому типу интерфейса, который может быть использован объектом в качестве интерфейса обратного вызова. Ввиду того, что IConnectionPoint не выставлен как часть единицы идентификации объекта, он не может быть обнаружен посредством QueryInterface. Вместо этого в СОМ предусмотрен второй интерфейс, который выставлен как часть единицы идентификации объекта, которая позволяет клиентам запрашивать реализацию IConnectionPoint, соответствующую отдельному типу интерфейса обратного вызова:

[object,uuid(B196B284-BAB4-101A-B69C-00AA00341D07)] interface IConnectionPointContainer : IUnknown { // get all possible IConnectionPoint implementations // получаем все возможные реализации IConnectionPoint HRESULT EnumConnectionPoints([out] IEnumConnectionPoints ** ppEnum); // get the IConnectionPoint implementation for riid // получаем реализацию IConnectionPoint для riid HRESULT FindConnectionPoint([in] REFIID riid, [out] IConnectionPoint ** ppCP); }


Содержание  Назад  Вперед