Partager via


Utilisation d’objets Thread-Safe

S’applique à : Outlook 2013 | Outlook 2016

Les applications clientes peuvent supposer que les objets utilisés directement ou comme rappels sont toujours thread-safe, sauf dans les cas suivants :

  • Objet status d’un fournisseur de transport obtenu via un appel client à IMAPISession ::OpenEntry avec un identificateur d’entrée à partir de la ligne de la table status du fournisseur.

  • Tous les objets de formulaire MAPI obtenus via un appel client à MAPIOpenFormMgr. Les objets de formulaire obéissent aux règles de modèle d’appartement et les clients doivent les utiliser et tous les objets qu’ils contiennent uniquement sur le thread qui les a créés.

Lorsqu’un client accède à la ligne d’un fournisseur de transport dans la table status qui inclut l’identificateur d’entrée de l’objet status associé, le client peut appeler OpenEntry avec cet identificateur d’entrée pour ouvrir l’objet status. Cet objet status n’est pas thread-safe, car les fournisseurs de transport s’exécutent dans le contexte du spouleur MAPI et ne conservent pas de contexte distinct pour leur objet status. L’objet status obéit aux règles de modèle d’appartement et les clients doivent l’utiliser uniquement sur le thread qui l’a créé.

Un client doit également appeler MAPIInitialize sur chaque thread avant d’utiliser des objets MAPI et MAPIUninitialize une fois cette utilisation terminée. Ces appels doivent être effectués même si les objets à utiliser sont passés au thread à partir d’une source externe. MAPIInitialize et MAPIUninitialize peuvent être appelés à partir de n’importe où, sauf à partir d’une fonction DllMain Win32, fonction appelée par le système lorsque les processus et les threads sont initialisés et terminés, ou lors d’appels aux fonctions LoadLibrary et FreeLibrary .

Les objets d’utilisation indirecte ne doivent jamais être supposés être thread-safe. Les objets d’utilisation indirecte sont retournés par des méthodes qui nécessitent des pointeurs d’interface de destination comme paramètres d’entrée. ImapIProp ::CopyTo et CopyProps, IMAPIFolder ::CopyFolder et CopyMessage, et IMsgServiceAdmin ::CopyMsgServiceService sont des exemples de ces méthodes. Si un fournisseur de services souhaite appeler un tel objet à partir d’un thread autre que celui sur lequel il a été passé, le fournisseur est chargé de marshaler explicitement l’objet.