Uso de objetos Thread-Safe
Hace referencia a: Outlook 2013 | Outlook 2016
Las aplicaciones cliente pueden suponer que los objetos usados directamente o como devoluciones de llamada siempre son seguros para subprocesos, excepto en los casos siguientes:
Objeto de estado de un proveedor de transporte obtenido a través de una llamada de cliente a IMAPISession::OpenEntry con un identificador de entrada de la fila de tabla de estado del proveedor.
Todos los objetos de formulario MAPI obtenidos a través de una llamada de cliente a MAPIOpenFormMgr. Los objetos de formulario obedecen las reglas del modelo de apartamento y los clientes deben usarlos y todos los objetos contenidos por ellos solo en el subproceso que los creó.
Cuando un cliente accede a la fila de un proveedor de transporte en la tabla de estado que incluye el identificador de entrada del objeto de estado asociado, el cliente puede llamar a OpenEntry con ese identificador de entrada para abrir el objeto de estado. Este objeto de estado no es seguro para subprocesos porque los proveedores de transporte se ejecutan en el contexto de la cola MAPI y no mantienen un contexto independiente para su objeto de estado. El objeto status obedece a las reglas del modelo de apartamento y los clientes solo deben usarlo en el subproceso que lo creó.
Un cliente también debe invocar MAPIInitialize en cada subproceso antes de usar cualquier objeto MAPI y MAPIUninitialize cuando se complete ese uso. Estas llamadas deben realizarse incluso si los objetos que se van a usar se pasan al subproceso desde un origen externo. MAPIInitialize y MAPIUninitialize se pueden llamar desde cualquier lugar excepto desde dentro de una función DllMain win32 , una función invocada por el sistema cuando se inicializan y finalizan procesos y subprocesos, o bien a las llamadas a las funciones LoadLibrary y FreeLibrary .
Nunca se debe suponer que los objetos de uso indirecto son seguros para subprocesos. Los objetos de uso indirecto se devuelven mediante métodos que requieren punteros de interfaz de destino como parámetros de entrada. Algunos ejemplos de estos métodos son IMAPIProp::CopyTo y CopyProps, IMAPIFolder::CopyFolder y CopyMessage e IMsgServiceAdmin::CopyMsgService. Si un proveedor de servicios quiere llamar a este tipo de objeto desde un subproceso distinto del que se pasó, el proveedor es responsable de serializar explícitamente el objeto.