Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
S’applique à : Outlook 2013 | Outlook 2016
Les applications clientes et les fournisseurs de services écrits en C définissent des objets MAPI en créant une structure de données et un tableau de pointeurs de fonction ordonnés appelés table de fonctions virtuelles ou vtable. Un pointeur vers la table virtuelle doit être le premier membre de la structure de données.
Dans la vtable elle-même, il existe un pointeur pour chaque méthode dans chaque interface prise en charge par l’objet . L’ordre des pointeurs doit suivre l’ordre des méthodes dans la spécification d’interface publiée dans le fichier d’en-tête Mapidefs.h. Chaque pointeur de fonction dans la table virtuelle est défini sur l’adresse de l’implémentation réelle de la méthode . En C++, le compilateur configure automatiquement la table virtuelle. En C, ce n’est pas le cas.
L’illustration suivante montre comment cela fonctionne. La zone située à l’extrême gauche représente un client qui doit utiliser un objet fournisseur de services. Par le biais de la session, le client obtient un pointeur vers l’objet, lpObject. La vtable apparaît en premier dans l’objet, suivie des données privées et des méthodes. Le pointeur vtable pointe vers la vtable réelle, qui contient des pointeurs vers chacune des implémentations des méthodes dans l’interface.
Implémentation d’objet
L’exemple de code suivant montre comment un fournisseur de services C peut définir un objet status simple. Le premier membre est le pointeur vtable ; le reste de l’objet est constitué de membres de données.
typedef struct _MYSTATUSOBJECT
{
const STATUS_Vtbl FAR *lpVtbl;
ULONG cRef;
ANOTHEROBJ *pObj;
LPMAPIPROP lpProp;
LPFREEBUFFER lpFreeBuf;
} MYSTATUSOBJECT, *LPMYSTATUSOBJ;
Étant donné que cet objet est un objet status, la table vtable inclut des pointeurs vers les implémentations de chacune des méthodes de l’interface IMAPIStatus : IMAPIProp, ainsi que des pointeurs vers les implémentations de chacune des méthodes dans les interfaces de base ( IUnknown et IMAPIProp). L’ordre des méthodes dans la table virtuelle correspond à l’ordre spécifié tel que défini dans le fichier d’en-tête 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
};
Les clients et les fournisseurs de services écrits en C utilisent des objets indirectement via la table virtuelle et ajoutent un pointeur d’objet comme premier paramètre de chaque appel. Chaque appel à une méthode d’interface MAPI nécessite un pointeur vers l’objet appelé comme premier paramètre. C++ définit un pointeur spécial appelé pointeur this à cet effet. Le compilateur C++ ajoute implicitement le pointeur this comme premier paramètre à chaque appel de méthode. En C, il n’y a pas de pointeur de ce type ; il doit être explicitement ajouté.
Le code suivant montre comment un client peut effectuer un appel à un instance de MYSTATUSOBJECT :
lpMyObj->lpVtbl->ValidateState(lpMyObj, ulUIParam, ulFlags);