Точки подключения
Данный раздел объясняет, как реализовать точки подключения (ранее известные как точки подключения 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
Обычно точки подключения» — «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 для каждого активного соединения.