OpenIMsgOnIStg
Hace referencia a: Outlook 2013 | Outlook 2016
Compila un nuevo objeto IMessage sobre un objeto OLE IStorage existente, que se usará en una sesión de mensaje.
Propiedad | Valor |
---|---|
Archivo de encabezado: |
Imessage.h |
Implementado por: |
MAPI |
Llamado por: |
Aplicaciones cliente y proveedores de servicios |
SCODE OpenIMsgOnIStg(
LPMSGSESS lpMsgSess,
LPALLOCATEBUFFER lpAllocateBuffer,
LPALLOCATEMORE lpAllocateMore,
LPFREEBUFFER lpFreeBuffer,
LPMALLOC lpmalloc,
LPVOID lpMapiSup,
LPSTORAGE lpStg,
MSGCALLRELEASE FAR * lpfMsgCallRelease,
ULONG ulCallerData,
ULONG ulFlags,
LPMESSAGE FAR * lppMsg
);
Parameters
lpMsgSess
[in] Puntero a un objeto de sesión de mensaje en el que se va a crear el nuevo objeto IMessage-on-IStorage.
lpAllocateBuffer
[in] Puntero a la función MAPIAllocateBuffer , que se usará para asignar memoria.
lpAllocateMore
[in] Puntero a la función MAPIAllocateMore , que se usará para asignar memoria adicional.
lpFreeBuffer
[in] Puntero a la función MAPIFreeBuffer , que se usará para liberar memoria.
lpMalloc
[in] Puntero a un objeto de asignador de memoria que expone la interfaz OLE IMalloc . La interfaz IMessage debe usar este método de asignación al trabajar con interfaces como IStorage e IStream.
lpMapiSup
[in] Puntero opcional a un objeto de compatibilidad MAPI que un proveedor de servicios puede usar para llamar a los métodos de la interfaz IMAPISupport : IUnknown .
lpStg
[entrada, salida] Puntero a un objeto OLE IStorage que está abierto y tiene permiso de solo lectura o lectura y escritura. Dado que IMessage no admite el acceso de solo escritura, OpenIMsgOnIStg no acepta un objeto de almacenamiento abierto en modo de solo escritura.
lpfMsgCallRelease
[in] Puntero opcional a una función de devolución de llamada basada en el prototipo MSGCALLRELEASE al que MAPI debe llamar después de la última versión del objeto IMessage-on-IStorage.
ulCallerData
[in] Datos del llamador guardados por MAPI con el objeto IMessage-on-IStorage y pasados a la función de devolución de llamada basada en MSGCALLRELEASE. Los datos proporcionan contexto sobre el objeto IMessage que se va a liberar y el objeto IStorage sobre el que se creó.
ulFlags
[in] Máscara de bits de marcas usadas para controlar si se llama al método OLE IStorage::Commit cuando la aplicación cliente o el proveedor de servicios llaman al método IMessage::SaveChanges . Se pueden establecer las siguientes marcas:
IMSG_NO_ISTG_COMMIT
No se llamará al método OLE IStorage::Commit cuando el cliente o el proveedor llame a SaveChanges.
MAPI_UNICODE
Permite la creación de archivos de .msg Unicode. El archivo IMessage resultante muestra STORE_UNICODE_OK en su PR_STORE_SUPPORT_MASK y admite propiedades Unicode.
Nota:
La marca MAPI_UNICODE solo se admite en esta función en Outlook 2003 o superior.
lppMsg
[out] Puntero a un puntero al objeto IMessage abierto.
Valor devuelto
S_OK
La llamada se ha realizado correctamente y devuelva el valor esperado o los valores.
Comentarios
Solo se puede tener acceso a los atributos de propiedad en objetos de propiedad, es decir, objetos que implementan la interfaz IMAPIProp : IUnknown . Para que las propiedades MAPI estén disponibles en un objeto de almacenamiento estructurado OLE, OpenIMsgOnIStg compila un objeto IMessage : IMAPIProp sobre el objeto OLE IStorage . Los atributos de propiedad de estos objetos se pueden establecer o modificar con SetAttribIMsgOnIStg y recuperarse con GetAttribIMsgOnIStg.
Notas para los llamadores
Se debe abrir una sesión de mensaje con OpenIMsgSession antes de llamar a OpenIMsgOnIStg . Al proporcionar un parámetro lpMsgSess válido, asegúrese de que el nuevo mensaje se crea dentro de una sesión de mensaje para que se cierre cuando se cierre la sesión. Si lpMsgSess es NULL, el mensaje se crea independientemente de cualquier sesión de mensaje. Si la aplicación cliente o el proveedor de servicios que creó el mensaje no lo liberan, así como todos sus datos adjuntos y tablas abiertas, se pierde memoria y puede hacer que la aplicación finalice.
MAPI usa las funciones a las que apunta lpAllocateBuffer, lpAllocateMore y lpFreeBuffer para la mayoría de la asignación y desasignación de memoria, en particular para asignar memoria para su uso por las aplicaciones cliente al llamar a interfaces de objeto como IMAPIProp::GetProps e IMAPITable::QueryRows. Los punteros lpAllocateBuffer, lpAllocateMore y lpFreeBuffer son opcionales cuando se llama a la función OpenIMsgOnIStg con un parámetro lpMapiSup válido.
Dado que se trata de un objeto OLE subyacente, MAPI también debe usar la asignación de memoria OLE. Para obtener más información sobre los objetos de almacenamiento estructurado OLE y la asignación de memoria OLE, consulte la Referencia del programador OLE.
Si se proporciona un valor válido para lpMapiSup, IMessage admite las marcas de MAPI_DIALOG y ATTACH_DIALOG llamando al método IMAPISupport::D oProgressDialog para proporcionar una interfaz de usuario de progreso para los métodos IMAPIProp::CopyTo e IMessage::D eleteAttach . Además, el método IMessage::ModifyRecipients intenta convertir identificadores de entrada a corto plazo en identificadores de entrada a largo plazo llamando al método IMAPISupport::OpenAddressBook y realizando llamadas en el objeto de libreta de direcciones resultante. Si se pasa NULL para lpMapiSup, IMessage omite MAPI_DIALOG y ATTACH_DIALOG y almacena identificadores de entrada a corto plazo sin conversión.
El objeto IStorage al que apunta el parámetro lpStg debe abrirse en el modo STGM_READ o STGM_READWRITE. Si se usa el modo STGM_READWRITE, también debe establecerse el modo STGM_TRANSACTED.
La función de devolución de llamada a la que apunta el parámetro lpfMsgCallRelease es opcional; si se proporciona, debe basarse en el prototipo de función MSGCALLRELEASE . La interfaz IMessage lo llama cuando la última llamada a su método Release establece el recuento de referencias del objeto IMessage-on-IStorage en cero. La función de devolución de llamada se usa normalmente para liberar la interfaz IStorage subyacente. IMessage no intentará acceder al objeto IStorage al que apunta el parámetro lpStg después de realizar la devolución de llamada.
Algunos clientes o proveedores pueden escribir datos adicionales en el objeto IStorage más allá de lo que escribe el propio IMessage cuando se llama a su método SaveChanges . El cliente o proveedor puede usar la marca de IMSG_NO_ISTG_COMMIT para evitar que IMessage llame al método OLE IStorage::Commit al procesar una llamada a SaveChanges ; en este caso, el cliente o proveedor debe confirmar el objeto IStorage cuando se escriben los datos adicionales. Para ayudar en esto, la implementación de IMessage garantiza el nombre de todos los subalmacenamientos que crea en el objeto IStorage a partir de la cadena "__", es decir, con dos caracteres de subrayado. El cliente o el proveedor pueden evitar colisiones de nombres manteniendo sus nombres de subalmacenamiento fuera de este espacio de nombres.
MAPI no define el comportamiento de varias operaciones abiertas realizadas en un subobjeto de un mensaje, como datos adjuntos, una secuencia o un mensaje incrustado. MAPI actualmente permite que un subobjeto que ya está abierto se abra una vez más, pero MAPI realiza la operación abierta incrementando el recuento de referencias para el objeto abierto existente y devolviéndolo al cliente o proveedor que llamó al método IMessage::OpenAttach o IMAPIProp::OpenProperty . Esto significa que el acceso solicitado para la primera operación abierta en un subobjeto es el acceso proporcionado para todas las operaciones abiertas posteriores, independientemente del acceso solicitado por las operaciones.
El procedimiento correcto para colocar un mensaje en un archivo adjunto es llamar al método IMAPIProp::OpenProperty con un identificador de interfaz de IID_IMessage. Actualmente, OpenProperty también admite la creación de datos adjuntos de mensajes disponibles directamente en la interfaz OLE IStorage , es decir, mediante el identificador de interfaz IID_IStorage. El acceso a IStorage es compatible para permitir una manera fácil de colocar un documento de Microsoft Word en un archivo adjunto sin convertirlo a o desde la interfaz OLE IStream. Sin embargo, es posible que IMessage no se comporte de forma predecible si OpenIMsgOnIStg se pasa un puntero IStorage a los datos adjuntos y, a continuación, los objetos se liberan en el orden incorrecto.
Referencia de MFCMAPI
Para obtener un ejemplo de código de MFCMAPI, vea la siguiente tabla.
Archivo | Función | Comment |
---|---|---|
File.cpp |
LoadMSGToMessage |
MFCMAPI usa el método OpenIMsgOnIStg para abrir una interfaz IMessage encima de . ARCHIVO MSG para que el archivo se pueda manipular con MAPI. |