Поддержка уведомлений
Реализация интерфейсов точки подключения для поставщика и потребителя
Для реализации уведомлений класс поставщика должен наследоваться от IRowsetNotifyCP и IConnectionPointContainer.
IRowsetNotifyCP
реализует сайт поставщика для интерфейса точки подключения IRowsetNotify. IRowsetNotifyCP
реализует широковещательные функции, чтобы советовать прослушивателям точку IID_IRowsetNotify
подключения изменений содержимого набора строк.
Необходимо также реализовать и зарегистрировать IRowsetNotify
в получателе (также известном как приемник) с помощью IRowsetNotifyImpl , чтобы потребитель смог обрабатывать уведомления. Сведения о реализации интерфейса точки подключения для потребителя см. в разделе "Получение уведомлений".
Кроме того, класс должен иметь карту, которая определяет запись точки подключения, как показано ниже:
BEGIN_CONNECTION_POINT_MAP
CONNECTIONPOINT_ENTRY (IID_IRowsetNotify)
END_CONNECTION_POINT_MAP
Добавление IRowsetNotify
Чтобы добавить IRowsetNotify
, необходимо добавить IConnectionPointContainerImpl<rowset-name>
и IRowsetNotifyCP<rowset-name>
в цепочку наследования.
Например, вот цепочка наследования в RUpdateRowset
UpdatePV:
Примечание.
Пример кода может отличаться от указанного здесь. Его следует рассматривать как более актуальную версию.
///////////////////////////////////////////////////////////////////////////
// class RUpdateRowset (in rowset.h)
class RUpdateRowset :
public CRowsetImpl< RUpdateRowset, CAgentMan, CUpdateCommand,
CAtlArray< CAgentMan, CAtlArray<CAgentMan>>, CSimpleRow,
IRowsetScrollImpl< RUpdateRowset, IRowsetScroll >>,
public IRowsetUpdateImpl< RUpdateRowset, CAgentMan >,
public IConnectionPointContainerImpl<RUpdateRowset>,
public IRowsetNotifyCP<RUpdateRowset>
Настройка записей карты COM
Кроме того, в набор строк необходимо добавить следующее:
COM_INTERFACE_ENTRY(IConnectionPointContainer)
COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer)
Эти макросы позволяют любому пользователю, вызывающему QueryInterface
контейнер точки подключения (на основе IRowsetNotify
) найти запрошенный интерфейс в поставщике. Пример использования точек подключения см. в примере и руководстве ATL POLYGON.
Настройка записей карты точки подключения
Кроме того, необходимо добавить карту точки подключения. Выглядеть он должен примерно так:
BEGIN_CONNECTION_POINT_MAP(rowset-name)
CONNECTION_POINT_ENTRY(_uuidof(IRowsetNotify))
END_CONNECTION_POINT_MAP()
Эта карта точки подключения позволяет компоненту найти IRowsetNotify
его в поставщике.
Установка свойств
Вам также необходимо добавить следующие свойства в поставщик. Необходимо добавить только свойства на основе поддерживаемых интерфейсов.
Свойство | Добавить, если вы поддерживаете |
---|---|
DBPROP_IConnectionPointContainer | Всегда |
DBPROP_NOTIFICATIONGRANULARITY | Всегда |
DBPROP_NOTIFICATIONPHASES | Всегда |
DBPROP_NOTIFYCOLUMNSET | IRowsetChange |
DBPROP_NOTIFYROWDELETE | IRowsetChange |
DBPROP_NOTIFYROWINSERT | IRowsetChange |
DBPROP_NOTIFYROWSETFETCHPOSITIONCHANGE | Всегда |
DBPROP_NOTIFYROWFIRSTCHANGE | IRowsetUpdate |
DBPROP_NOTIFYROWSETRELEASE | Всегда |
DBPROP_NOTIFYROWUNDOCHANGE | IRowsetUpdate |
DBPROP_NOTIFYROWUNDODELETE | IRowsetUpdate |
DBPROP_NOTIFYROWUNDOINSERT | IRowsetUpdate |
DBPROP_NOTIFYROWUPDATE | IRowsetUpdate |
Большая часть реализации уведомлений уже внедрена в шаблоны поставщиков OLE DB. Если вы не добавляете IRowsetNotifyCP
в цепочку наследования, компилятор удаляет весь код из потока компиляции, что делает размер кода меньше.