ID: Q170226
The information in this article applies to:
This article shows the minimum code necessary to embed a message in a message.
The following function illustrates the code necessary to embed a source message object to an existing destination message object:
HRESULT AttachMessage ( LPMESSAGE pMsgDst, // The message to attach to
LPMESSAGE pMsgSrc, // The message to attach
ULONG ulProps, // Count of properties to set
// on attachment
LPSPropValue pAttachProps // Properties to set
// on attachment
)
{
// Initialize local variables.
HRESULT hRes = S_OK; // Status code of MAPI calls
ULONG ulAttachNum = 0L; // Number of attachments
LPATTACH pAttach = NULL; // Attachment object
LPMESSAGE pmsgAttach = NULL; // Message interface for
// attachment object
LPSPropProblemArray pProb = NULL; // Problem array
SizedSPropTagArray(7, excludeTags); // Properties excluded by
// Exchange client.
// Create an attachment in the Destintation message that was passed
// in to this function - pMsgDst.
if ( FAILED ( hRes = pMsgDst -> CreateAttach ( NULL,
0L,
&ulAttachNum,
&pAttach ) ) )
goto Quit;
if ( FAILED ( hRes = pAttach -> SetProps ( ulProps,
pAttachProps,
&pProb ) ) )
goto Quit;
// Need to open the data object property and get back an IMessage
// interface pointer so I can call CopyTo and pass it as the
// destination object.
hRes = pAttach -> OpenProperty ( PR_ATTACH_DATA_OBJ,
&IID_IMessage,
0L,
MAPI_CREATE|MAPI_MODIFY,
(LPUNKNOWN *) &pmsgAttach );
// Must set cValues otherwise we will most likely get
// MAPI_E_INVALID_PARAMETER. Other tags are excluded to save bits
// and time.
excludeTags.cValues = 7;
excludeTags.aulPropTag[0] = PR_ACCESS;
excludeTags.aulPropTag[1] = PR_BODY;
excludeTags.aulPropTag[2] = PR_RTF_SYNC_BODY_COUNT;
excludeTags.aulPropTag[3] = PR_RTF_SYNC_BODY_CRC;
excludeTags.aulPropTag[4] = PR_RTF_SYNC_BODY_TAG;
excludeTags.aulPropTag[5] = PR_RTF_SYNC_PREFIX_COUNT;
excludeTags.aulPropTag[6] = PR_RTF_SYNC_TRAILING_COUNT;
// Call CopyTo from the attached message to copy all the properties
// from it to the destination object except the ones we asked to be
// excluded.
if ( FAILED ( hRes = pMsgSrc -> CopyTo (0L,
0L,
(LPSPropTagArray)&excludeTag,
0L,
0L,
&IID_IMessage,
(LPVOID) pmsgAttach,
0L,
&pProb ) ) )
goto Quit;
// Save the changes to the destination object, the attachment, and
// the outer message. Order is important.
if(FAILED(hRes = pmsgAttach->SaveChanges ( KEEP_OPEN_READWRITE ) ) )
{
MessageBox ( (ULONG *)m_hWnd,
"Cannot save changes to message attachment",
"Error", MB_OK | MB_ICONSTOP );
goto Quit;
}
if ( FAILED (hRes = pAttach->SaveChanges ( KEEP_OPEN_READWRITE ) ) )
{
MessageBox ( (ULONG *)m_hWnd,
"Cannot save changes to attachment.",
"Error", MB_OK | MB_ICONSTOP );
goto Quit;
}
if ( FAILED ( hRes = pMsgDst->SaveChanges ( KEEP_OPEN_READWRITE ) ) )
{
MessageBox ( (ULONG *)m_hWnd,
"Cannot save changes to message.",
"Error", MB_OK | MB_ICONSTOP );
goto Quit;
}
Quit:
pmsgAttach -> Release ( );
pAttach -> Release ( );
return hRes;
}
Keywords : kbMsg kbMAPI100
Version : WINDOWS:1.0
Platform : WINDOWS
Issue type : kbhowto
Last Reviewed: June 20, 1997