Subprocesos en MAPI
Hace referencia a: Outlook 2013 | Outlook 2016
Un subproceso es la entidad básica a la que un sistema operativo asigna el tiempo de CPU. Un subproceso tiene sus propios registros, pila, prioridad y almacenamiento, pero comparte un espacio de direcciones y procesa recursos como tokens de acceso. Los subprocesos también comparten memoria, con un subproceso que lee lo que ha escrito otro subproceso.
Los clientes MAPI usan los siguientes modelos de subprocesos genéricos.
Modelo de subprocesos | Descripción |
---|---|
Modelo de subproceso único |
Todos los objetos se usan en el único subproceso. |
Modelo de subprocesamiento de apartamentos |
Un objeto solo se puede usar en el subproceso que lo creó. |
Modelo de subproceso libre o de grupo de subprocesos |
Un objeto se puede usar en cualquier subproceso. |
MAPI usa el modelo de subproceso libre, que admite objetos seguros para subprocesos que se pueden usar en cualquier subproceso en cualquier momento. OLE usa el modelo de subprocesos de apartamento. El modelo de subprocesos de apartamento admite objetos que se deben transferir explícitamente cuando un subproceso distinto del que creó el objeto debe usar ese objeto.
El mecanismo que OLE usa para transferir objetos de un subproceso a otro se conoce como serialización. La serialización implica un objeto de código auxiliar y un objeto proxy. Estos objetos especiales empaqueta los parámetros de la interfaz en el objeto que se va a serializar, transfieren estos parámetros al otro subproceso y los desemmpaquetan a su llegada. El conflicto entre los dos modelos multiproceso surge cuando se envía un objeto MAPI de subproceso libre a otro proceso mediante la llamada a procedimiento remoto OLE "ligero" o LRPC. LRPC cambia la semántica del objeto de subprocesos libres a subprocesos de apartamento mediante la intercalación de interfaces de código auxiliar y proxy con el comportamiento de subproceso de apartamento entre el objeto y su autor de la llamada. El reconocimiento de las situaciones en MAPI que conducen a este conflicto puede ayudar a los clientes y proveedores de servicios a evitar que se produzcan problemas.
Se puede tener acceso a un objeto MAPI:
A través de llamadas directas a sus métodos mediante un puntero de interfaz devuelto por un proveedor de servicios o MAPI vinculado al proceso del cliente, como el objeto de sesión devuelto por MAPILogonEx.
A través de llamadas indirectas a sus métodos mediante un puntero de interfaz devuelto por cualquier proveedor de servicios, como el objeto de carpeta copiado de otra carpeta en IMAPIFolder::CopyFolder.
A través de una función de devolución de llamada, como el método IMAPIAdviseSink::OnNotify pasado a un proveedor de servicios o a MAPI en una llamada Advise o los métodos que pueden mostrar el progreso en una operación larga.