Abrir datos adjuntos
Hace referencia a: Outlook 2013 | Outlook 2016
La apertura de datos adjuntos implica mostrar sus datos. Por ejemplo, cuando se abre un archivo adjunto, se muestra el contenido del archivo. Mientras que los mensajes y carpetas se abren con sus identificadores de entrada, los datos adjuntos se abren con sus números de datos adjuntos, PR_ATTACH_NUM propiedades. Para obtener más información, vea PR_ATTACH_NUM (PidTagAttachNumber). Los números de datos adjuntos están disponibles a través de la tabla de datos adjuntos de un mensaje.
Para abrir todos los datos adjuntos en un mensaje
Llame al método IMessage::GetAttachmentTable del mensaje para obtener acceso a su tabla de datos adjuntos.
Llame a HrQueryAllRows para recuperar todas las filas de la tabla.
Para cada fila:
Abra los datos adjuntos pasando el número de datos adjuntos representado en la columna PR_ATTACH_NUM en una llamada al método IMessage::OpenAttach del mensaje. Para obtener más información, vea IMessage::OpenAttach. OpenAttach devuelve un puntero a una implementación de IAttach que proporciona acceso a las propiedades de datos adjuntos.
Llame al método IMAPIProp::GetProps de los datos adjuntos para recuperar su propiedad PR_ATTACH_METHOD . Para obtener más información, vea IMAPIProp::GetProps y PR_ATTACH_METHOD (PidTagAttachMethod).
Si PR_ATTACH_METHOD está establecido en ATTACH_BY_REF_ONLY, llame a IMAPIProp::GetProps para recuperar la propiedad PR_ATTACH_PATHNAME . Para obtener más información, vea PR_ATTACH_PATHNAME (PidTagAttachPathname).
Si PR_ATTACH_METHOD está establecido en ATTACH_BY_VALUE, llame a IMAPIProp::OpenProperty para abrir la propiedad PR_ATTACH_DATA_BIN con la interfaz IStream . Vea el código de ejemplo que sigue a este procedimiento. Para obtener más información, vea IMAPIProp::OpenProperty y PR_ATTACH_DATA_BIN (PidTagAttachDataBinary).
Si PR_ATTACH_METHOD está establecido en ATTACH_OLE y los datos adjuntos son un objeto OLE 2:
Llame a IMAPIProp::OpenProperty para abrir la propiedad PR_ATTACH_DATA_OBJ con la interfaz IStreamDocfile . Intente usar esta interfaz porque es una implementación de IStream garantizada para trabajar con almacenamiento estructurado con la menor cantidad de sobrecarga. Para obtener más información, vea PR_ATTACH_DATA_OBJ (PidTagAttachDataObject).
Si se produce un error en la llamada a OpenProperty , vuelva a llamarla para recuperar la propiedad PR_ATTACH_DATA_BIN con la interfaz IStreamDocfile .
Si se produce un error en esta segunda llamada a OpenProperty , vuelva a intentar llamar a OpenProperty para recuperar PR_ATTACH_DATA_OBJ. Sin embargo, en lugar de especificar IStreamDocfile, especifique la interfaz IStorage .
Si PR_ATTACH_METHOD se establece en ATTACH_EMBEDDED_MSG, no es inusual que el valor de PR_ATTACH_DATA_OBJ contenga un error. Esto se debe a que usted y el implementador de tabla no tienen ninguna manera de acordar el tipo de objeto que se va a devolver. Para recuperar un puntero al mensaje adjunto, abra los datos adjuntos mediante IMessage::OpenAttach. A continuación, obtenga acceso a los datos adjuntos llamando a su método IMAPIProp::OpenProperty . Para obtener más información, vea IMessage::OpenAttach e IMAPIProp::OpenProperty.
Puede solicitar que se abran datos adjuntos en modo de lectura y escritura o de solo lectura. Solo lectura es el modo predeterminado y muchos proveedores de almacén de mensajes abren todos los datos adjuntos en este modo independientemente de lo que soliciten los clientes. Pase la marca MAPI_BEST_ACCESS para solicitar que el proveedor del almacén de mensajes conceda el mayor nivel de acceso posible y, a continuación, recupere la propiedad PR_ACCESS_LEVEL de los datos adjuntos abiertos para determinar el nivel de acceso que se concedió realmente. Para obtener más información, vea PR_ACCESS_LEVEL (PidTagAccessLevel).
En el ejemplo siguiente se muestra cómo abrir los datos en la propiedad PR_ATTACH_DATA_BIN de datos adjuntos. Asigna punteros a dos secuencias: una para el archivo y otra para los datos adjuntos. La función OpenStreamOnFile abre la secuencia de archivos en modo de solo lectura. La llamada al método IMAPIProp::OpenProperty de los datos adjuntos abre la secuencia de datos adjuntos en modo de lectura y escritura. Para obtener más información, vea PR_ATTACH_DATA_BIN, OpenStreamOnFile e IMAPIProp::OpenProperty. A continuación, el código copia desde el flujo de archivos a la secuencia de datos adjuntos y libera ambas secuencias.
LPSTREAM pStreamFile, pStreamAtt;
HRESULT hr;
hr = OpenStreamOnFile (MAPIAllocateBuffer, MAPIFreeBuffer,
STGM_READ, "myfile.doc", NULL, &pStreamFile);
if (HR_SUCCEEDED(hr))
{
// Open the destination stream in the attachment object
hr = pAttach->OpenProperty (PR_ATTACH_DATA_BIN,
&IID_IStream,
0,
MAPI_MODIFY | MAPI_CREATE,
(LPUNKNOWN *)&pStreamAtt);
if (HR_SUCCEEDED(hr))
{
STATSTG StatInfo;
pStreamFile->Stat (&StatInfo, STATFLAG_NONAME);
hResult = pStreamFile->CopyTo (pStreamAtt, StatInfo.cbSize,
NULL, NULL);
pStreamAtt->Release();
}
pStreamFile->Release();
}