정보: MSG 방어탑 파일로 메시지 저장

기술 자료 번역 기술 자료 번역
기술 자료: 171907 - 이 문서가 적용되는 제품 보기.
모두 확대 | 모두 축소

요약

이 문서에서는 메시지를 .msg 파일 형식을 지원하는 모든 클라이언트에서 읽을 수 있는 복합 문서에--특히: .msg 파일--저장하는 방법을 보여 주는 코드가 포함되어 있습니다.

추가 정보

아래 함수를 in 매개 변수로 유효한 메시지 개체를 사용하며, 해당 속성을 사용하여 메시지 복제본을 만들고 .msg 형식을 사용하여 복합 파일을 저장합니다. 메시지의 제목 줄에 새 파일의 파일 이름으로 사용됩니다.

참고: 이 함수의 in 매개 변수의 제목 줄에 특수 문자가 예기치 않은 결과가 발생할 수 있습니다. 제목 줄에 특수 문자를 피하기 위해 코드를 쓸 수 있지만, 항목으로 germane 아닌 않고 이러한 코드를 의도적으로 유지됩니다.
#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;
}
				
CLSID_MailMessage 복합 문서 같이 모든 버전의 Outlook과 Exchange 클라이언트를 지원합니다. 서로 다른 CLSID를 사용할 다른 CLISD 구조적된 저장소 메시지를 작성할 때 사용하는 다른 클라이언트를 지원하도록 때문입니다.

많은 수의 받는 사람 또는 첨부 파일이 있는 메시지를 저장할 때 함께 MAPI_E_NOT_ENOUGH_MEMORY CopyTo 작업이 실패합니다 있습니다. 이 구조적된 저장소 및 스트림 알려진된 문제가 있습니다. 새 루트 저장소 파일이 열릴 구조적된 저장소, 저장되는 메시지 새 첨부 파일 또는 받는 때마다 추가된. 트랜잭션이 완료될 때까지 이러한 파일은 닫을 수 없습니다. 운영 체제 동시에 열린 루트 저장소 파일 수에 대한 제한을 500KB로 때문에 알려진된 해결 방법은 없습니다. 자세한 내용은 아래 문서 번호를 눌러 Microsoft 기술 자료에 있는 문서를 클릭하십시오.
163202Simultaeously 열기 루트 저장소 파일 개수 제한
모든 버전의 Outlook과 함께 이 제한 사항은에 의해 영향을 받습니다.

속성

기술 자료: 171907 - 마지막 검토: 2005년 8월 18일 목요일 - 수정: 2.5
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Office Outlook 2007
  • Microsoft Messaging Application Programming Interface
  • Microsoft Exchange Client 5.5
  • Microsoft Exchange Client 5.0
  • Microsoft Exchange Client 4.0
  • Microsoft Exchange Client 5.0
키워드:?
kbmt kbinfo kbmsg KB171907 KbMtko
기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.

피드백 보내기

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com