Точки подключения
В этой статье описывается, как реализовать точки подключения (ранее называвшихся серверами OLE точки подключения) с помощью классов CCmdTarget и CConnectionPoint MFC.
В прошлом, модель COM (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 для каждого активного подключения.