Схемы подключения
Элементы управления 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, TRUE, &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, TRUE, dwCookie);
Требования
Заголовок: afxctl.h