Поделиться через


Точки подключения

Данный раздел объясняет, как реализовать точки подключения (ранее известные как точки подключения OLE) с помощью классов CCmdTarget и CConnectionPoint MFC.

В прошлом, модель COM, общий механизм (IUnknown::QueryInterface), разрешившего объекты для реализации и предоставлять функциональность в интерфейсах.Однако соответствующий механизм, разрешившего объекты для предоставления их возможность вызвать определенные интерфейсы не был задан.Это значит, что указанный элемент модели COM как входящие указатели на объекты (указателям к интерфейсам объекта), обработано, но он не имели точную модель для исходящих интерфейсов (указателей объект содержит к интерфейсам других объектов).Теперь содержит вызванную модель COM, точками соединения, которая поддерживает данную функцию.

Соединение имеет 2 частей: объект, вызывающий интерфейс, источником, а объект, реализующий интерфейс, приемником.Точка подключения интерфейс, предоставленный источником.Можно предоставлять точку подключения, источник учитывает приемники для установки подключений на себя (источник).Через механизм точки подключения (интерфейс IConnectionPoint ), указатель на интерфейс получателя передается к исходному объекту.Этот указатель предоставляет источник с доступом к реализации приемника набора функций элементов.Например, чтобы создать событие, предоставляемого приемником, источник может вызывать соответствующий метод реализации приемника.Следующая диаграмма демонстрирует, описанных точку подключения просто.

Реализованная точка подключения

Реализованные точки подключения

MFC реализует эту модель в классах CConnectionPoint и CCmdTarget.Классы, производные от CConnectionPoint реализовать интерфейс IConnectionPoint, используемый для предоставления точки подключения к другим объектам.Классы, производные от CCmdTarget реализовать интерфейс IConnectionPointContainer, который может перечислить все из доступных объектов точек подключения или находит конкретную точку подключения.

Для каждой точки подключения, реализованной в вашем классе, необходимо объявить часть соединения, которая реализует точку подключения.Если реализуется одну или несколько точек соединения, необходимо также объявить одно сопоставление соединения в классе.Сопоставление соединения таблица точек подключения, поддерживаемых элементом управления ActiveX.

В следующих примерах демонстрируется простое сопоставление соединения и одну точку подключения.В первом примере объявляется сопоставление и точка подключения; во втором примере реализован сопоставление и точку.Обратите внимание, что CMyClass должно быть CCmdTarget- производным классом.В первом примере кода добавляется в объявление класса в разделе protected :

class CMyClass : public CCmdTarget
{
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 или добавить функции-члены ваших, следует объявить их между этими 2 макросами.Например, макрос CONNECTION_IID переопределяет функцию-член CConnectionPoint::GetIID помещенный между этими 2 макросами.

Во втором примере кода добавляется в файл реализации элемента управления (cpp-файл).Этот код реализует сопоставление соединения, которое содержит точку подключения, SampleConnPt:

BEGIN_CONNECTION_MAP(CMyClass, CCmdTarget)
    CONNECTION_PART(CMyClass, IID_ISampleSink, SampleConnPt)
END_CONNECTION_MAP()

Если класс имеет больше чем одну точку подключения, вставьте дополнительные BEGIN_CONNECTION_MAP и макросы CONNECTION_PART между макросами END_CONNECTION_MAP.

Наконец, добавьте вызов EnableConnections в конструкторе типа.Примеры.

CMyClass::CMyClass()
{
   EnableConnections();
}

После этого кода был вставлен, CCmdTarget- производный класс предоставляет точку подключения для интерфейса ISampleSink .На следующем рисунке показано в примере.

Точка подключения, реализованная с MFC

Реализация точки подключения MFC

Обычно точки подключения» — «multicasting поддерживают возможность вещать к нескольким приемникам установления соединения на один и тот же интерфейс.В следующем фрагменте пример демонстрирует многоадресной рассылка ", перебора каждый приемник в точке подключения:

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 для каждого активного соединения.

См. также

Основные понятия

МОДЕЛЬ COM MFC