Класс CConnectionPoint
Определяет особый тип интерфейса, используемый для взаимодействия с другими объектами OLE и называемый "точкой подключения".
Синтаксис
class CConnectionPoint : public CCmdTarget
Участники
Открытые конструкторы
Имя | Описание |
---|---|
CConnectionPoint::CConnectionPoint | Формирует объект CConnectionPoint . |
Открытые методы
Имя | Описание |
---|---|
CConnectionPoint::GetConnections | Извлекает все точки подключения в карте подключения. |
CConnectionPoint::GetContainer | Извлекает контейнер элемента управления, который владеет картой подключения. |
CConnectionPoint::GetIID | Извлекает идентификатор интерфейса точки подключения. |
CConnectionPoint::GetMaxConnections | Извлекает максимальное количество точек подключения, поддерживаемых элементом управления. |
CConnectionPoint::GetNextConnection | Извлекает указатель на элемент подключения в pos. |
CConnectionPoint::GetStartPosition | Запускает итерацию карты, возвращая значение POSITION, которое можно передать вызову GetNextConnection . |
CConnectionPoint::OnAdvise | Вызывается платформой при установке или нарушении подключений. |
CConnectionPoint::QuerySinkInterface | Извлекает указатель на запрошенный интерфейс приемника. |
Замечания
В отличие от обычных интерфейсов OLE, которые используются для реализации и предоставления функциональных возможностей элемента управления OLE, точка подключения реализует исходящий интерфейс, который может инициировать действия на других объектах, таких как срабатывание событий и уведомлений об изменениях.
Соединение состоит из двух частей: объекта, вызывающего интерфейс, который называется "источником", и объект, реализующий интерфейс, называемый приемником. Предоставляя точку подключения, источник позволяет приемникам устанавливать подключения к себе. Через механизм точки подключения исходный объект получает указатель на реализацию приемника набора функций-членов. Например, чтобы вызвать событие, реализованное приемником, источник может вызвать соответствующий метод реализации приемника.
По умолчанию производный COleControl
класс реализует две точки подключения: один для событий и один для уведомлений об изменении свойств. Эти подключения используются соответственно для запуска событий и уведомления приемника (например, контейнера элемента управления) при изменении значения свойства. Поддержка также предоставляется для элементов управления OLE для реализации дополнительных точек подключения. Для каждой дополнительной точки подключения, реализованной в классе управления, необходимо объявить "часть подключения", реализующую точку подключения. Если вы реализуете одну или несколько точек подключения, необходимо также объявить одну карту подключения в классе управления.
В следующем примере показана простая карта подключения и одна точка подключения для Sample
элемента управления OLE, состоящая из двух фрагментов кода: первая часть объявляет карту подключения и точку; вторая реализует эту карту и точку. Первый фрагмент вставляется в объявление класса элемента управления в разделе protected
:
// Connection point for ISample interface
BEGIN_CONNECTION_PART(CMyClass, SampleConnPt)
CONNECTION_IID(IID_ISampleSink)
END_CONNECTION_PART(SampleConnPt)
DECLARE_CONNECTION_MAP()
Макросы BEGIN_CONNECTION_PART и END_CONNECTION_PART объявляют внедренный класс XSampleConnPt
(производный от CConnectionPoint
), который реализует эту конкретную точку подключения. Если вы хотите переопределить любые CConnectionPoint
функции-члены или добавить собственные функции-члены, объявите их между этими двумя макросами. Например, макрос CONNECTION_IID переопределяет CConnectionPoint::GetIID
функцию-член при размещении между этими двумя макросами.
Второй фрагмент кода вставляется в файл реализации (. CPP) класса элемента управления. Этот код реализует карту подключения, которая включает дополнительную точку подключения, SampleConnPt
:
BEGIN_CONNECTION_MAP(CMyClass, CCmdTarget)
CONNECTION_PART(CMyClass, IID_ISampleSink, SampleConnPt)
END_CONNECTION_MAP()
После вставки этих фрагментов кода элемент управления OLE образец предоставляет точку подключения для ISampleSink
интерфейса.
Как правило, точки подключения поддерживают многоадресную рассылку, которая позволяет транслировать несколько приемников, подключенных к одному интерфейсу. В следующем фрагменте кода показано, как выполнить многоадресную рассылку путем итерации по каждому приемнику в точке подключения:
void CMyClass::CallSinkFunc()
{
POSITION pos = m_xSampleConnPt.GetStartPosition();
ISampleSink *pSampleSink;
while (pos != NULL)
{
pSampleSink = (ISampleSink *)(m_xSampleConnPt.GetNextConnection(pos));
if (pSampleSink != NULL)
{
pSampleSink->SinkFunc();
}
}
}
В этом примере извлекается текущий набор подключений в точке SampleConnPt
подключения с вызовом CConnectionPoint::GetConnections
. Затем он выполняет итерацию по подключениям и вызовам ISampleSink::SinkFunc
для каждого активного подключения.
Дополнительные сведения об использовании CConnectionPoint
см. в статье "Точки подключения".
Иерархия наследования
CConnectionPoint
Требования
Заголовок: afxdisp.h
CConnectionPoint::CConnectionPoint
Формирует объект CConnectionPoint
.
CConnectionPoint();
CConnectionPoint::GetConnections
Вызовите эту функцию, чтобы получить все активные подключения для точки подключения.
const CPtrArray* GetConnections();
Возвращаемое значение
Указатель на массив активных подключений (приемников). Некоторые указатели в массиве могут иметь значение NULL. Каждый указатель, отличный от NULL в этом массиве, можно безопасно преобразовать в указатель на интерфейс приемника с помощью оператора приведения.
CConnectionPoint::GetContainer
Вызывается платформой для получения IConnectionPointContainer
точки подключения.
virtual LPCONNECTIONPOINTCONTAINER GetContainer();
Возвращаемое значение
В случае успешного выполнения указатель на контейнер; в противном случае ЗНАЧЕНИЕ NULL.
Замечания
Обычно эта функция реализуется макросом BEGIN_CONNECTION_PART.
CConnectionPoint::GetIID
Вызывается платформой для получения идентификатора интерфейса точки подключения.
virtual REFIID GetIID() = 0;
Возвращаемое значение
Ссылка на идентификатор интерфейса точки подключения.
Замечания
Переопределите эту функцию, чтобы вернуть идентификатор интерфейса для этой точки подключения.
CConnectionPoint::GetMaxConnections
Вызывается платформой для получения максимального количества подключений, поддерживаемых точкой подключения.
virtual int GetMaxConnections();
Возвращаемое значение
Максимальное количество подключений, поддерживаемых элементом управления, или -1, если ограничение не ограничено.
Замечания
Реализация по умолчанию возвращает значение -1, указывающее отсутствие ограничения.
Переопределите эту функцию, если вы хотите ограничить количество приемников, которые могут подключаться к элементу управления.
CConnectionPoint::GetNextConnection
Извлекает указатель на элемент подключения в pos.
LPUNKNOWN GetNextConnection(POSITION& pos) const;
Параметры
pos
Указывает ссылку на значение POSITION, возвращаемое предыдущим GetNextConnection
или вызовом GetStartPosition .
Возвращаемое значение
Указатель на элемент подключения, указанный в pos или NULL.
Замечания
Эта функция наиболее полезна для итерации всех элементов карты подключения. При итерации пропустите все NUL-адреса, возвращаемые из этой функции.
Пример
void CMyClass::CallSinkFunc()
{
POSITION pos = m_xSampleConnPt.GetStartPosition();
ISampleSink *pSampleSink;
while (pos != NULL)
{
pSampleSink = (ISampleSink *)(m_xSampleConnPt.GetNextConnection(pos));
if (pSampleSink != NULL)
{
pSampleSink->SinkFunc();
}
}
}
CConnectionPoint::GetStartPosition
Запускает итерацию карты, возвращая значение POSITION, которое можно передать в вызов GetNextConnection .
POSITION GetStartPosition() const;
Возвращаемое значение
Значение POSITION, указывающее начальную позицию для итерации карты; или NULL, если карта пуста.
Замечания
Последовательность итерации не предсказуема; Таким образом, "первый элемент в карте" не имеет особого значения.
Пример
См. пример CConnectionPoint::GetNextConnection.
CConnectionPoint::OnAdvise
Вызывается платформой при установке или разрыве соединения.
virtual void OnAdvise(BOOL bAdvise);
Параметры
bAdvise
ЗНАЧЕНИЕ TRUE, если устанавливается подключение; в противном случае ЗНАЧЕНИЕ FALSE.
Замечания
Реализация по умолчанию не выполняет никаких действий.
Переопределите эту функцию, если требуется уведомление при подключении приемников к точке подключения или отключению от нее.
CConnectionPoint::QuerySinkInterface
Извлекает указатель на запрошенный интерфейс приемника.
virtual HRESULT QuerySinkInterface(
LPUNKNOWN pUnkSink,
void** ppInterface);
Параметры
pUnkSink
Идентификатор запрашиваемого интерфейса приемника.
ppInterface
Указатель на указатель интерфейса, определенный pUnkSink. Если объект не поддерживает этот интерфейс, значение * ppInterface имеет значение NULL.
Возвращаемое значение
Стандартное значение HRESULT.