INFORMACJE: zapisywanie wiadomości w pliku MSG


Podsumowanie


Ten artykuł zawiera kod, w którym pokazano, jak zapisać wiadomość do dokumentu złożonego — w szczególności plik MSG--możliwy do odczytania przez dowolnego klienta obsługującego format pliku MSG.

Więcej informacji


Poniższe działanie przyjmuje prawidłowy obiekt Message jako parametr in i używa jego właściwości, aby utworzyć duplikat wiadomości i zapisać go w pliku złożonym w formacie. msg. Jako nazwa pliku nowego pliku jest wyświetlany wiersz temat wiadomości. Uwaga: znaki specjalne w wierszu temat parametru in tej funkcji mogą powodować nieoczekiwane wyniki. Po zapisaniu kodu w celu uniknięcia znaków specjalnych w wierszu tematu nie jest to język niemiecki, a kod ten jest zamierzony.
#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;}
Wszystkie wersje programu Outlook i klienta programu Exchange obsługują CLSID_MailMessage jako dokument złożony. Jedynym powodem użycia innego identyfikatora CLSID jest obsługiwanie innych klientów korzystających z różnych CLISD podczas pisania wiadomości w magazynie strukturalnym. Podczas zapisywania wiadomości, które mają dużą liczbę adresatów lub załączników, operacja Kopiuj kończy się niepowodzeniem z MAPI_E_NOT_ENOUGH_MEMORY. Jest to spowodowane znanym problemem z magazynowaniem i strumieniem strukturalnym. Za każdym razem, gdy do wiadomości zapisywanej w magazynie strukturalnym zostanie dodany nowy załącznik lub adresat, zostanie otwarty nowy plik magazynu głównego. Te pliki nie są zamykane do czasu ukończenia transakcji. Ponieważ system operacyjny nakłada ograniczenie na liczbę jednocześnie otwartych plików magazynu głównego, nie ma żadnych znanych obejścii. Aby uzyskać dodatkowe informacje, kliknij numer artykułu poniżej w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:
163202 Limit liczby plików magazynu głównego Open Simultaeously
Ograniczenie to również dotyczy wszystkich wersji programu Outlook.