Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Aplica-se a: Outlook 2013 | Outlook 2016
Aplicativos cliente e provedores de serviços escritos em C definem objetos MAPI criando uma estrutura de dados e uma matriz de ponteiros de função ordenados conhecidos como uma tabela de funções virtuais ou vtable. Um ponteiro para a vtable deve ser o primeiro membro da estrutura de dados.
Na própria vtable, há um ponteiro para cada método em cada interface compatível com o objeto. A ordem dos ponteiros deve seguir a ordem dos métodos na especificação de interface publicada no arquivo de cabeçalho Mapidefs.h. Cada ponteiro de função na vtable é definido como o endereço da implementação real do método. No C++, o compilador configura automaticamente a vtable. Em C, não.
A ilustração a seguir mostra como isso funciona. A caixa à esquerda representa um cliente que precisa usar um objeto de provedor de serviços. Durante a sessão, o cliente obtém um ponteiro para o objeto, lpObject. A vtable aparece primeiro no objeto seguido por dados e métodos privados. O ponteiro vtable aponta para a vtable real, que contém ponteiros para cada uma das implementações dos métodos na interface.
Object implementation
O exemplo de código a seguir mostra como um provedor de serviços C pode definir um objeto status simples. O primeiro membro é o ponteiro vtable; o restante do objeto é composto por membros de dados.
typedef struct _MYSTATUSOBJECT
{
const STATUS_Vtbl FAR *lpVtbl;
ULONG cRef;
ANOTHEROBJ *pObj;
LPMAPIPROP lpProp;
LPFREEBUFFER lpFreeBuf;
} MYSTATUSOBJECT, *LPMYSTATUSOBJ;
Como esse objeto é um objeto status, a vtable inclui ponteiros para implementações de cada um dos métodos na interface IMAPIStatus : IMAPIProp, bem como ponteiros para implementações de cada um dos métodos nas interfaces base – IUnknown e IMAPIProp. A ordem dos métodos na vtable corresponde à ordem especificada conforme definido no arquivo de cabeçalho 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
};
Clientes e provedores de serviços gravados em C usam objetos indiretamente por meio da vtable e adicionam um ponteiro de objeto como o primeiro parâmetro em cada chamada. Cada chamada para um método de interface MAPI requer um ponteiro para o objeto que está sendo chamado como seu primeiro parâmetro. O C++ define um ponteiro especial conhecido como este ponteiro para essa finalidade. O compilador C++ adiciona implicitamente esse ponteiro como o primeiro parâmetro a cada chamada de método. Em C não há esse ponteiro; ela deve ser adicionada explicitamente.
O código a seguir demonstra como um cliente pode fazer uma chamada para uma instância de MYSTATUSOBJECT:
lpMyObj->lpVtbl->ValidateState(lpMyObj, ulUIParam, ulFlags);