Info: Nachricht in msg-Verbunddatei speichern


Zusammenfassung


Dieser Artikel enthält Code, der zeigt, wie Sie eine Nachricht in einem zusammengesetzten Dokument – insbesondere einer msg-Datei – speichern, die von jedem Client lesbar ist, der das MSG-Dateiformat unterstützt.

Weitere Informationen


Die nachstehende Funktion akzeptiert ein gültiges Nachrichtenobjekt als in-Parameter und verwendet dessen Eigenschaften, um ein Duplikat der Nachricht zu erstellen und Sie in einer zusammengesetzten Datei mit dem msg-Format zu speichern. Die Betreffzeile der Nachricht wird als Dateinamen der neuen Datei verwendet. Hinweis: Sonderzeichen in der Betreffzeile des in-Parameters dieser Funktion können zu unerwarteten Ergebnissen führen. Während Code geschrieben werden kann, um Sonderzeichen in der Betreffzeile zu vermeiden, ist das Thema nicht Deutsch, und dieser Code wird absichtlich ausgelassen.
#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 Versionen von Outlook und der Exchange-Client unterstützen CLSID_MailMessage als Verbunddokument. Der einzige Grund, eine andere CLSID zu verwenden, besteht darin, andere Clients zu unterstützen, die eine andere CLISD verwenden, wenn Sie Nachrichten in strukturierten Speicher schreiben. Beim Speichern von Nachrichten, die eine große Anzahl von Empfängern oder Anlagen aufweisen, ist es möglich, dass der CopyTo-Vorgang mit MAPI_E_NOT_ENOUGH_MEMORY fehlschlägt. Dies ist auf ein bekanntes Problem mit strukturiertem Speicher und Datenströmen zurückzuführen. Jedes Mal, wenn der Nachricht, die im strukturierten Speicher gespeichert ist, eine neue Anlage oder ein neuer Empfänger hinzugefügt wird, wird eine neue Stammspeicher Datei geöffnet. Diese Dateien werden erst geschlossen, wenn die Transaktion abgeschlossen ist. Da das Betriebssystem die Anzahl der gleichzeitig geöffneten Stammspeicher Dateien begrenzt, gibt es keine bekannte Problemumgehung. Wenn Sie weitere Informationen wünschen, klicken Sie unten auf die Artikelnummer, um den Artikel in der Microsoft Knowledge Base anzuzeigen:
163202 Begrenzung der Anzahl von Simultaeously geöffneten Stammspeicher Dateien
Alle Versionen von Outlook sind auch von dieser Einschränkung betroffen.