Ouverture d’une pièce jointe
S’applique à : Outlook 2013 | Outlook 2016
L’ouverture d’une pièce jointe implique l’affichage de ses données. Par exemple, lorsqu’une pièce jointe est ouverte, le contenu du fichier s’affiche. Alors que les messages et les dossiers sont ouverts à l’aide de leurs identificateurs d’entrée, les pièces jointes sont ouvertes à l’aide de leurs numéros de pièce jointe PR_ATTACH_NUM propriétés. Pour plus d’informations, consultez PR_ATTACH_NUM (PidTagAttachNumber). Les numéros de pièce jointe sont disponibles via la table des pièces jointes d’un message.
Pour ouvrir toutes les pièces jointes dans un message
Appelez la méthode IMessage ::GetAttachmentTable du message pour accéder à sa table de pièces jointes.
Appelez HrQueryAllRows pour récupérer toutes les lignes de la table.
Pour chaque ligne :
Ouvrez la pièce jointe en transmettant le numéro de pièce jointe représenté dans la colonne PR_ATTACH_NUM dans un appel à la méthode IMessage ::OpenAttach du message. Pour plus d’informations, consultez IMessage ::OpenAttach. OpenAttach retourne un pointeur vers une implémentation IAttach qui fournit l’accès aux propriétés des pièces jointes.
Appelez la méthode IMAPIProp ::GetProps de la pièce jointe pour récupérer sa propriété PR_ATTACH_METHOD . Pour plus d’informations, consultez IMAPIProp ::GetProps et PR_ATTACH_METHOD (PidTagAttachMethod).
Si PR_ATTACH_METHOD est défini sur ATTACH_BY_REF_ONLY, appelez IMAPIProp ::GetProps pour récupérer la propriété PR_ATTACH_PATHNAME . Pour plus d’informations, consultez PR_ATTACH_PATHNAME (PidTagAttachPathname).
Si PR_ATTACH_METHOD est défini sur ATTACH_BY_VALUE, appelez IMAPIProp ::OpenProperty pour ouvrir la propriété PR_ATTACH_DATA_BIN avec l’interface IStream . Consultez l’exemple de code suivant cette procédure. Pour plus d’informations, consultez IMAPIProp ::OpenProperty et PR_ATTACH_DATA_BIN (PidTagAttachDataBinary).
Si PR_ATTACH_METHOD est défini sur ATTACH_OLE et que la pièce jointe est un objet OLE 2 :
Appelez IMAPIProp ::OpenProperty pour ouvrir la propriété PR_ATTACH_DATA_OBJ avec l’interface IStreamDocfile . Essayez d’utiliser cette interface, car il s’agit d’une implémentation d’IStream garantie pour fonctionner avec un stockage structuré avec le moins de surcharge. Pour plus d’informations, consultez PR_ATTACH_DATA_OBJ (PidTagAttachDataObject).
Si l’appel OpenProperty échoue, appelez-le à nouveau pour récupérer la propriété PR_ATTACH_DATA_BIN avec l’interface IStreamDocfile .
Si ce deuxième appel OpenProperty échoue, réessayez d’appeler OpenProperty pour récupérer PR_ATTACH_DATA_OBJ. Toutefois, au lieu de spécifier IStreamDocfile, spécifiez l’interface IStorage .
Si PR_ATTACH_METHOD est défini sur ATTACH_EMBEDDED_MSG, il n’est pas rare que la valeur de PR_ATTACH_DATA_OBJ contienne une erreur. Cela est dû au fait que vous et l’implémenteur de table n’avez aucun moyen de s’entendre sur le type d’objet à retourner. Pour récupérer un pointeur vers le message joint, ouvrez la pièce jointe à l’aide de IMessage ::OpenAttach. Accédez ensuite aux données de la pièce jointe en appelant sa méthode IMAPIProp ::OpenProperty . Pour plus d’informations, consultez IMessage ::OpenAttach et IMAPIProp ::OpenProperty.
Vous pouvez demander l’ouverture d’une pièce jointe en mode lecture/écriture ou en lecture seule. La lecture seule est le mode par défaut, et de nombreux fournisseurs de magasins de messages ouvrent toutes les pièces jointes dans ce mode, quelle que soit la demande des clients. Transmettez l’indicateur MAPI_BEST_ACCESS pour demander que le fournisseur de la banque de messages accorde le niveau d’accès le plus élevé possible, puis récupérez la propriété PR_ACCESS_LEVEL de la pièce jointe ouverte pour déterminer le niveau d’accès réellement accordé. Pour plus d’informations, consultez PR_ACCESS_LEVEL (PidTagAccessLevel).
L’exemple suivant montre comment ouvrir les données dans la propriété PR_ATTACH_DATA_BIN d’une pièce jointe. Il alloue des pointeurs à deux flux : un pour le fichier et un pour la pièce jointe. La fonction OpenStreamOnFile ouvre le flux de fichier en mode lecture seule. L’appel à la méthode IMAPIProp ::OpenProperty de la pièce jointe ouvre le flux de pièces jointes en mode lecture/écriture. Pour plus d’informations, consultez PR_ATTACH_DATA_BIN, OpenStreamOnFile et IMAPIProp ::OpenProperty. Le code copie ensuite du flux de fichier vers le flux de pièces jointes et libère les deux flux.
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();
}