المعلومات: حفظ رسالة إلى ملف مركب


الملخص


تحتوي هذه المقالة علي التعليمات البرمجية التي توضح كيفيه حفظ رسالة إلى مستند مركب--بشكل خاص ، الملفات التي يمكن قراءتها بواسطة اي عميل يدعم تنسيق الملف.

مزيد من المعلومات


تاخذ الدالة أدناه كائن رسالة صالح كمعلمه in وتستخدم خصائصه لإنشاء تكرار للرسالة وحفظه إلى ملف مركب باستخدام التنسيق.. يتم استخدام سطر موضوع الرسالة كاسم ملف الملف الجديد. ملاحظه: قد تؤدي الأحرف الخاصة في سطر الموضوع في المعلمة in في هذه الدالة إلى ظهور نتائج غير متوقعه. علي الرغم من انه يمكن كتابه التعليمات البرمجية لتجنب الأحرف الخاصة في سطر الموضوع ، فهذا يعني انه لم يتم جرمان الموضوع ومن التعليمات البرمجية التالية عمدا.
#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 مختلف هو دعم العملاء الآخرين الذين يستخدمون كليسد مختلفا عند كتابه الرسائل إلى مساحة تخزين منظمه. عند حفظ الرسائل التي تحتوي علي عدد كبير من المستلمين أو المرفقات ، من الممكن ان تفشل عمليه نسخلنسخها مع MAPI_E_NOT_ENOUGH_MEMORY. هذا ناتج عن مشكله معروفه في التخزين والتدفقات المنظمة. إذا تمت أضافه مرفق أو مستلم جديد إلى الرسالة التي يتم حفظها في مساحة تخزين منظمه ، سيتم فتح ملف تخزين جذري جديد. لا يتم إغلاق هذه الملفات حتى تكتمل المعاملة. نظرا لان نظام التشغيل يفرض حدا علي عدد ملفات التخزين الجذري المفتوحة في الوقت نفسه ، فلا يوجد حل بديل معروف. للحصول علي مزيد من المعلومات ، انقر فوق رقم المقالة أدناه لعرض المقالة في قاعده معارف Microsoft:
163202 الحد الأقصى لعدد ملفات التخزين الجذري لسيمولتايوسلي المفتوحة
تتاثر كل إصدارات Outlook بهذا القيد أيضا.