Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Область применения: Outlook 2013 | Outlook 2016
Клиентские приложения и поставщики услуг, написанные на языке C, определяют объекты MAPI путем создания структуры данных и массива упорядоченных указателей функций, известных как виртуальная таблица функций или vtable. Указатель на vtable должен быть первым членом структуры данных.
В самой vtable есть один указатель на каждый метод в каждом интерфейсе, поддерживаемом объектом . Порядок указателей должен соответствовать порядку методов в спецификации интерфейса, опубликованной в файле заголовка Mapidefs.h. Для каждого указателя функции в vtable задается адрес фактической реализации метода. В C++ компилятор автоматически настраивает vtable. В C это не так.
На следующем рисунке показано, как это работает. Поле слева представляет клиент, который должен использовать объект поставщика услуг. Через сеанс клиент получает указатель на объект lpObject. Vtable отображается сначала в объекте, за которым следуют частные данные и методы. Указатель vtable указывает на фактическую vtable, которая содержит указатели на каждую из реализаций методов в интерфейсе.
Реализация объекта
В следующем примере кода показано, как поставщик служб C может определить простой объект состояния. Первым элементом является указатель vtable; остальная часть объекта состоит из элементов данных.
typedef struct _MYSTATUSOBJECT
{
const STATUS_Vtbl FAR *lpVtbl;
ULONG cRef;
ANOTHEROBJ *pObj;
LPMAPIPROP lpProp;
LPFREEBUFFER lpFreeBuf;
} MYSTATUSOBJECT, *LPMYSTATUSOBJ;
Так как этот объект является объектом состояния, vtable включает указатели на реализации каждого из методов в интерфейсе IMAPIStatus : IMAPIProp , а также указатели на реализации каждого из методов в базовых интерфейсах — IUnknown и IMAPIProp. Порядок методов в vtable соответствует указанному порядку, определенному в файле заголовка Mapidefs.h.
static const MYOBJECT_Vtbl vtblSTATUS =
{
STATUS_QueryInterface,
STATUS_AddRef,
STATUS_Release,
STATUS_GetLastError,
STATUS_SaveChanges,
STATUS_GetProps,
STATUS_GetPropList,
STATUS_OpenProperty,
STATUS_SetProps,
STATUS_DeleteProps,
STATUS_CopyTo,
STATUS_CopyProps,
STATUS_GetNamesFromIDs,
STATUS_GetIDsFromNames,
STATUS_ValidateState,
STATUS_SettingsDialog,
STATUS_ChangePassword,
STATUS_FlushQueues
};
Клиенты и поставщики услуг, написанные на языке C, используют объекты косвенно через vtable и добавляют указатель объекта в качестве первого параметра в каждом вызове. Для каждого вызова метода интерфейса MAPI требуется указатель на объект, вызываемый в качестве первого параметра. Для этой цели C++ определяет специальный указатель, известный как этот указатель. Компилятор C++ неявно добавляет этот указатель в качестве первого параметра для каждого вызова метода. В C нет такого указателя; он должен быть добавлен явным образом.
В следующем коде показано, как клиент может выполнить вызов экземпляра MYSTATUSOBJECT:
lpMyObj->lpVtbl->ValidateState(lpMyObj, ulUIParam, ulFlags);