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


Схемы подключения

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

Библиотека классов Microsoft Foundation предлагает модель программирования, которая поддерживает точки подключения. В этой модели "карты подключений" используются для назначения интерфейсов или точек подключения для элемента управления OLE. Карты подключений содержат один макрос для каждой точки подключения. Дополнительные сведения о картах подключений см. в CConnectionPoint классе.

Как правило, элемент управления поддерживает только две точки подключения: один для событий и один для уведомлений о свойствах. Они реализуются базовым классом COleControl и не требуют дополнительной работы модуля записи элементов управления. Любые другие точки подключения, которые необходимо реализовать в классе, необходимо добавить вручную. Для поддержки карт подключений и точек MFC предоставляет следующие макросы:

Объявление и размежевание карты подключений

Имя Описание
BEGIN_CONNECTION_PART Объявляет внедренный класс, реализующий дополнительную точку подключения (необходимо использовать в объявлении класса).
END_CONNECTION_PART Заканчивает объявление точки подключения (необходимо использовать в объявлении класса).
CONNECTION_IID Указывает идентификатор интерфейса точки подключения элемента управления.
DECLARE_CONNECTION_MAP Объявляет, что карта подключения будет использоваться в классе (необходимо использовать в объявлении класса).
BEGIN_CONNECTION_MAP Начинает определение карты подключения (необходимо использовать в реализации класса).
END_CONNECTION_MAP Заканчивает определение карты подключения (необходимо использовать в реализации класса).
CONNECTION_PART Указывает точку подключения в карте подключения элемента управления.

Следующие функции помогают приемнику устанавливать и отключать подключение с помощью точек подключения:

Инициализация и завершение точек подключения

Имя Описание
AfxConnectionAdvise Устанавливает соединение между источником и приемником.
AfxConnectionUnadvise Разрывает соединение между источником и приемником.

BEGIN_CONNECTION_PART

BEGIN_CONNECTION_PART Используйте макрос, чтобы начать определение дополнительных точек подключения за пределами точек подключения к событиям и свойствам.

BEGIN_CONNECTION_PART(theClass, localClass)

Параметры

theClass Указывает имя класса элемента управления, точка подключения которого это.

localClass Указывает имя локального класса, реализующего точку подключения.

Замечания

В файле объявления (.h), который определяет функции-члены для класса, запустите точку подключения с макросом BEGIN_CONNECTION_PART . Затем добавьте CONNECTION_IID макрос и любые другие функции-члены, которые вы хотите реализовать. Наконец, завершите сопоставление точек подключения с помощью макроса END_CONNECTION_PART .

Требования

Заголовок afxdisp.h

END_CONNECTION_PART

Заканчивает объявление точки подключения.

END_CONNECTION_PART(localClass)

Параметры

localClass
Указывает имя локального класса, реализующего точку подключения.

Требования

Заголовок afxdisp.h

CONNECTION_IID

Используйте между BEGIN_CONNECTION_PART макросами END_CONNECTION_PART , чтобы определить идентификатор интерфейса для точки подключения, поддерживаемой элементом управления OLE.

CONNECTION_IID(iid)

Параметры

iid
Идентификатор интерфейса, вызываемого точкой подключения.

Замечания

Аргумент iid — это идентификатор интерфейса, используемый для идентификации интерфейса, вызываемого точкой подключения на подключенных приемниках. Например:

CONNECTION_IID(IID_ISampleSink)

Указывает точку ISinkInterface подключения, которая вызывает интерфейс.

Требования

Заголовок afxdisp.h

DECLARE_CONNECTION_MAP

Каждый COleControlпроизводный класс в программе может предоставить карту подключения, чтобы указать дополнительные точки подключения, поддерживаемые элементом управления.

DECLARE_CONNECTION_MAP()

Замечания

Если элемент управления поддерживает дополнительные точки, используйте DECLARE_CONNECTION_MAP макрос в конце объявления класса. Затем в файле .cpp, который определяет функции-члены для класса, используйте BEGIN_CONNECTION_MAP макрос, CONNECTION_PART макросы для каждой точки подключения элемента управления и END_CONNECTION_MAP макрос для объявления конца карты подключения.

Требования

Заголовок afxdisp.h

BEGIN_CONNECTION_MAP

Каждый COleControlпроизводный класс в программе может предоставить карту подключения, чтобы указать точки подключения, которые будет поддерживать ваш элемент управления.

BEGIN_CONNECTION_MAP(theClass, theBase)

Параметры

theClass
Указывает имя класса элемента управления, сопоставление подключения которого это.

theBase
Указывает имя базового класса theClass.

Замечания

В файле реализации (.CPP), который определяет функции-члены для класса, запустите карту подключения с BEGIN_CONNECTION_MAP макросом, а затем добавьте записи макросов для каждой точки подключения с помощью CONNECTION_PART макроса. Наконец, завершите сопоставление подключений с помощью макроса END_CONNECTION_MAP .

Требования

Заголовок afxdisp.h

END_CONNECTION_MAP

Заканчивает определение карты подключения.

END_CONNECTION_MAP()

Требования

Заголовок afxdisp.h

CONNECTION_PART

Сопоставляет точку подключения для элемента управления OLE с определенным идентификатором интерфейса.

CONNECTION_PART(theClass, iid, localClass)

Параметры

theClass
Указывает имя класса элемента управления, точка подключения которого это.

iid
Идентификатор интерфейса, вызываемого точкой подключения.

localClass
Указывает имя локального класса, реализующего точку подключения.

Замечания

Например:

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

реализует карту подключения с точкой подключения, которая вызывает IID_ISinkInterface интерфейс.

Требования

Заголовок afxdisp.h

AfxConnectionAdvise

Вызовите эту функцию, чтобы установить соединение между источником, заданным и приемником, указанным pUnkSrcв pUnkSink.

BOOL AFXAPI AfxConnectionAdvise(
    LPUNKNOWN pUnkSrc,
    REFIID iid,
    LPUNKNOWN pUnkSink,
    BOOL bRefCount,
    DWORD FAR* pdwCookie);

Параметры

pUnkSrc
Указатель на объект, вызывающий интерфейс.

pUnkSink
Указатель на объект, реализующий интерфейс.

iid
Идентификатор интерфейса подключения.

bRefCount
Для внепроцессных подключений этот параметр должен иметь TRUEзначение и указывает, что создание соединения должно привести к добавочному количеству pUnkSink ссылок.

Для подключений в процессе указывает, TRUE что создание соединения должно привести к добавочному количеству pUnkSink ссылок. FALSE указывает, что число ссылок не должно увеличиваться.

Предупреждение. Как правило, нельзя предсказать, какие подключения являются внутрипроцессными и какие подключения не обрабатываются, поэтому рекомендуется всегда задавать этот параметр TRUE.

pdwCookie
Указатель на DWORD место, в котором возвращается идентификатор подключения. Это значение должно передаваться в качестве dwCookie параметра AfxConnectionUnadvise при отключении подключения.

Возвращаемое значение

Ненулевое значение, если установлено подключение; в противном случае — 0.

Пример

//CMySink is a CCmdTarget-derived class supporting automation.
//Instantiate the sink class.
CMySink mysink;

//Get a pointer to sink's IUnknown, no AddRef done.
IID iid = IID_IUnknown;
IUnknown* pUnkSink = mysink.GetInterface(&iid);

//Establish a connection between source and sink.
//pUnkSrc is IUnknown of server obtained by CoCreateInstance().
//dwCookie is a cookie identifying the connection, and is needed
//to terminate this connection.
AfxConnectionAdvise(pUnkSrc, IID_ISampleSink, pUnkSink, FALSE, &dwCookie);

Требования

Заголовок: afxctl.h

AfxConnectionUnadvise

Вызовите эту функцию, чтобы отключить соединение между источником, заданным и приемником, указанным pUnkSrcв pUnkSink.

BOOL AFXAPI AfxConnectionUnadvise(
    LPUNKNOWN pUnkSrc,
    REFIID iid,
    LPUNKNOWN pUnkSink,
    BOOL bRefCount,
    DWORD dwCookie);

Параметры

pUnkSrc
Указатель на объект, вызывающий интерфейс.

pUnkSink
Указатель на объект, реализующий интерфейс.

iid
Идентификатор интерфейса интерфейса точки подключения.

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

Для подключений в процессе указывает, TRUE что создание соединения должно привести к уменьшению количества pUnkSink ссылок. FALSE указывает, что количество ссылок не должно быть отложено.

Предупреждение. Как правило, нельзя предсказать, какие подключения являются внутрипроцессными и какие подключения не обрабатываются, поэтому рекомендуется всегда задавать этот параметр TRUE.

dwCookie
Идентификатор подключения, возвращенный AfxConnectionAdvise.

Возвращаемое значение

Ненулевое значение, если подключение было отключено; в противном случае — 0.

Пример

//mysink is a CCmdTarget-derived class supporting automation.
//Get a pointer to sink's IUnknown, no AddRef done.
IID iid = IID_IUnknown;
IUnknown* pUnkSink = mysink.GetInterface(&iid);

//Terminate a connection between source and sink.
//pUnkSrc is IUnknown of server obtained by CoCreateInstance().
//dwCookie is a value obtained through AfxConnectionAdvise().
AfxConnectionUnadvise(pUnkSrc, IID_ISampleSink, pUnkSink, FALSE, dwCookie);

Требования

Заголовок: afxctl.h

См. также

Макросы и глобальные