ΠΛΗΡΟΦΟΡΙΕΣ: Αποθήκευση μηνυμάτων σε αρχείο σύνθετων ΛΑΘΟΥΣ

Μεταφράσεις άρθρων Μεταφράσεις άρθρων
Αναγν. άρθρου: 171907 - Δείτε τα προϊόντα στα οποία αναφέρεται το συγκεκριμένο άρθρο.
Ανάπτυξη όλων | Σύμπτυξη όλων

Περίληψη

Αυτό το άρθρο περιέχει κώδικα ο οποίος δείχνει πώς μπορείτε να αποθηκεύσετε ένα μήνυμα σε ένα σύνθετο έγγραφο--συγκεκριμένα ενός αρχείου .msg--που μπορεί να αναγνωστεί από οποιονδήποτε υπολογιστή-πελάτη που υποστηρίζει τη μορφή αρχείου .msg.

Περισσότερες πληροφορίες

Η παρακάτω συνάρτηση λαμβάνει ένα αντικείμενο έγκυρο μήνυμα ως παράμετρος σε και χρησιμοποιεί τις ιδιότητές του, για να δημιουργήσετε ένα αντίγραφο του μηνύματος και να αποθηκεύσετε ένα σύνθετο αρχείο χρησιμοποιώντας τη μορφή .msg. Η γραμμή θέματος του μηνύματος χρησιμοποιείται ως το όνομα αρχείου του νέου αρχείου.

ΣΗΜΕΙΩΣΗ: Οι ειδικοί χαρακτήρες στη γραμμή θέματος της παραμέτρου σε αυτής της συνάρτησης μπορεί να προκαλέσει μη αναμενόμενα αποτελέσματα. Ενώ ο κώδικας μπορεί να εγγραφεί για να αποφύγετε τους ειδικούς χαρακτήρες στη γραμμή θέματος, δεν είναι 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;
}
				
Όλες οι εκδόσεις του Outlook και το πρόγραμμα-πελάτη Exchange υποστηρίζει CLSID_MailMessage ως σύνθετο έγγραφο. Είναι ο μόνος λόγος για να χρησιμοποιήσετε ένα διαφορετικό CLSID να υποστηρίζουν άλλα προγράμματα-πελάτες που χρησιμοποιούν ένα διαφορετικό CLISD κατά την εγγραφή δομημένη αποθήκευσης μηνυμάτων.

Όταν αποθηκεύετε τα μηνύματα τα οποία έχουν μεγάλο αριθμό παραληπτών ή συνημμένα, είναι πιθανό ότι θα αποτύχει η λειτουργία CopyTo με MAPI_E_NOT_ENOUGH_MEMORY. Επειδή αυτό είναι ένα γνωστό ζήτημα με δομημένη αποθήκευσης και ροών. Κάθε φορά που ένα νέο συνημμένο ή του παραλήπτη έχει προστεθεί στο μήνυμα που αποθηκεύονται σε δομημένη αποθήκευση, ανοίγει ένα νέο αρχείο αποθήκευσης ρίζας. Αυτά τα αρχεία δεν έχουν κλείσει μέχρι να ολοκληρωθεί η συναλλαγή. Επειδή το λειτουργικό σύστημα επιβάλλει ένα όριο στον αριθμό των αρχείων αποθήκευσης ριζικού ταυτόχρονα ανοιχτά, δεν υπάρχει γνωστή λύση.Για πρόσθετες πληροφορίες, κάντε κλικ στον αριθμό του άρθρου παρακάτω, για να προβάλετε το άρθρο της Γνωσιακής Βάσης της Microsoft (Knowledge Base):
163202Το όριο του αριθμού των Simultaeously Άνοιγμα ρίζας αποθήκευσης αρχείων
Όλες οι εκδόσεις του Outlook επηρεάζεται από αυτόν τον περιορισμό.

Ιδιότητες

Αναγν. άρθρου: 171907 - Τελευταία αναθεώρηση: Σάββατο, 18 Δεκεμβρίου 2010 - Αναθεώρηση: 2.0
Οι πληροφορίες σε αυτό το άρθρο ισχύουν για:
  • Microsoft Office Outlook 2007
  • Microsoft Messaging Application Programming Interface
Λέξεις-κλειδιά: 
kbinfo kbmsg kbmt KB171907 KbMtel
Μηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.
Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη:171907

Αποστολή σχολίων

 

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