INFO: bericht opslaan in MSG-samengesteld bestand


Samenvatting


In dit artikel wordt uitgelegd hoe u een bericht kunt opslaan op een samen samengesteld document, met name een msg-bestand, dat kan worden gelezen door een client die de bestandsindeling. msg ondersteunt.

Meer informatie


De onderstaande functie heeft een geldig berichtobject als een in-parameter en gebruikt de eigenschappen om een kopie van het bericht te maken en deze op te slaan in een samengesteld bestand met de. msg-indeling. De onderwerpregel van het bericht wordt gebruikt als de bestandsnaam van het nieuwe bestand. Opmerking: speciale tekens in de onderwerpregel van de parameter in van deze functie kunnen onverwachte resultaten opleveren. U kunt code schrijven om speciale tekens in de onderwerpregel te voorkomen, maar het onderwerp is niet op het hoofdartikel en de code is onbedoeld.
#define INITGUID#include <objbase.h>#define USES_IID_IMessage#include <mapix.h>#include <mapitags.h>#include <mapidefs.h>#include <mapiutil.h>#include <mapiguid.h>#include <imessage.h>// {00020D0B-0000-0000-C000-000000000046}DEFINE_GUID(CLSID_MailMessage,0x00020D0B,0x0000, 0x0000, 0xC0, 0x00, 0x0, 0x00, 0x0, 0x00, 0x00, 0x46);HRESULT SaveToMSG ( LPMESSAGE pMessage ){    HRESULT hRes = S_OK;    LPSPropValue pSubject = NULL;    LPSTORAGE pStorage = NULL;    LPMSGSESS pMsgSession =  NULL;    LPMESSAGE pIMsg = NULL;    SizedSPropTagArray ( 7, excludeTags );    char szPath[_MAX_PATH];    char strAttachmentFile[_MAX_PATH];    LPWSTR lpWideCharStr = NULL;    ULONG cbStrSize = 0L;    // create the file name in the directory where "TMP" is defined    // with subject as the filename and ".msg" extension.    // get temp file directory    GetTempPath(_MAX_PATH, szPath);    // get subject line of message to copy. This will be used as the    // new file name.    HrGetOneProp( pMessage, PR_SUBJECT, &pSubject );    // fuse path, subject, and suffix into one string    strcpy ( strAttachmentFile, szPath );    strcat ( strAttachmentFile, pSubject->Value.lpszA  );    strcat ( strAttachmentFile, ".msg");    // get memory allocation function    LPMALLOC pMalloc = MAPIGetDefaultMalloc();    // Convert new file name to WideChar    cbStrSize = MultiByteToWideChar (CP_ACP,                                     MB_PRECOMPOSED,                                     strAttachmentFile,                                     -1, lpWideCharStr, 0);    MAPIAllocateBuffer ( cbStrSize * sizeof(WCHAR),                            (LPVOID *)&lpWideCharStr );    MultiByteToWideChar (CP_ACP,                         MB_PRECOMPOSED,                         strAttachmentFile,                         -1, lpWideCharStr, cbStrSize );    // create compound file    hRes = ::StgCreateDocfile(lpWideCharStr,                              STGM_READWRITE |                              STGM_TRANSACTED |                              STGM_CREATE, 0, &pStorage);    // Open an IMessage session.    hRes = ::OpenIMsgSession(pMalloc, 0, &pMsgSession);    // Open an IMessage interface on an IStorage object    hRes = ::OpenIMsgOnIStg(pMsgSession,                            MAPIAllocateBuffer,                            MAPIAllocateMore,                            MAPIFreeBuffer,                            pMalloc,                            NULL,                            pStorage,                            NULL, 0, 0, &pIMsg);    // write the CLSID to the IStorage instance - pStorage. This will    // only work with clients that support this compound document type    // as the storage medium. If the client does not support    // CLSID_MailMessage as the compound document, you will have to use    // the CLSID that it does support.    hRes = WriteClassStg(pStorage, CLSID_MailMessage );    // Specify properties to exclude in the copy operation. These are    // the properties that Exchange excludes to save bits and time.    // Should not be necessary to exclude these, but speeds the process    // when a lot of messages are being copied.    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;    // copy message properties to IMessage object opened on top of    // IStorage.    hRes = pMessage->CopyTo(0, NULL,                            (LPSPropTagArray)&excludeTags,                            NULL, NULL,                            (LPIID)&IID_IMessage,                            pIMsg, 0, NULL );    // save changes to IMessage object.    pIMsg -> SaveChanges ( KEEP_OPEN_READWRITE );    // save changes in storage of new doc file    hRes = pStorage -> Commit(STGC_DEFAULT);    // free objects and clean up memory    MAPIFreeBuffer ( lpWideCharStr );    pStorage->Release();    pIMsg->Release();    CloseIMsgSession ( pMsgSession );    pStorage = NULL;    pIMsg = NULL;    pMsgSession = NULL;    lpWideCharStr = NULL;    return hRes;}
Alle versies van Outlook en de Exchange-client ondersteunen CLSID_MailMessage als het samengestelde document. De enige reden voor het gebruik van een andere CLSID is het ondersteunen van andere clients met een andere CLISD wanneer u berichten schrijft naar Structured Storage. Wanneer u berichten opslaat met een groot aantal geadresseerden of bijlagen, is het mogelijk dat de CopyTo-bewerking mislukt met MAPI_E_NOT_ENOUGH_MEMORY. Dit komt door een bekend probleem met Structured Storage en streams. Telkens wanneer een nieuwe bijlage of geadresseerde wordt toegevoegd aan het bericht dat wordt opgeslagen in Structured Storage, wordt er een nieuw opslagbestand voor de hoofdmap geopend. Deze bestanden worden pas gesloten wanneer de transactie is voltooid. Aangezien het besturingssysteem een limiet heeft voor het aantal tegelijk geopende basis opslagruimte bestanden, is er geen bekende tijdelijke oplossing. Als u meer informatie wilt, klikt u op het volgende artikelnummer om het artikel in de Microsoft Knowledge Base weer te geven:
163202 Limiet voor het aantal geopende Simultaeously voor opslagbestanden
Alle versies van Outlook worden ook door deze beperking beïnvloed.