Microsoft KB Archive/252649

From BetaArchive Wiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Knowledge Base


How To Open a MAPI IMessage Interface with CDO Entry ID

Article ID: 252649

Article Last Modified on 8/25/2005



APPLIES TO

  • Microsoft Messaging Application Programming Interface
  • Microsoft Collaboration Data Objects 1.2
  • Microsoft Collaboration Data Objects 1.21



This article was previously published under Q252649

SUMMARY

When you work with CDO using Microsoft Visual C++, it may sometimes be necessary to switch over to MAPI. The code in the "More Information" section shows how to take a message in CDO and open that same message in MAPI.

MORE INFORMATION

//This code assumes that CDO has been imported with the following statement
//#import "cdo.dll" no_namespace
//and that we have a MAPI session opened with the same profile as the CDO session.
HRESULT OpenMAPIMessageFromCDOMessage(
    LPMAPISESSION lpMAPISession,
    MessagePtr pCDOMessage,
    LPMESSAGE* lppMessage)
{
    HRESULT hRes = S_OK;
    int cbSEID;
    LPENTRYID pbSEID;
    int cbEID;
    LPENTRYID pbEID;

    //Find CDO's StoreID
    bstr_t szStoreEID = pCDOMessage->StoreID;

    //Convert the StoreID to a byte array for OpenMsgStore
    cbSEID = strlen(szStoreEID)/2;
    hRes = MAPIAllocateBuffer(cbSEID, (void **)&pbSEID);
    FBinFromHex(szStoreEID, (LPBYTE)pbSEID);

    hRes = lpMAPISession->OpenMsgStore(
        0,
        cbSEID,
        pbSEID,
        0,
        MAPI_BEST_ACCESS,
        &lpMDB);
    MAPIFreeBuffer(pbSEID);
    if (FAILED(hRes)) return hRes;

    _variant_t lClass = pMessage->Class;

    //Find the CDO message's Entry ID
    bstr_t szEID
    if ((LONG) lClass == 26)//that is, we have an appointment item
    {
        //CDO tacks on 80 extra bytes to appointment item IDs. Skip them.
        szEID = ((char *)(bstr_t)pMessage->ID)+80;
    }
    else 
    {
        szEID = pCDOMessage->ID;
    }

    //Convert the ID to a byte array for OpenMsgStore
    cbEID = strlen(szEID)/2;
    hRes = MAPIAllocateBuffer(cbEID, (void **)&pbEID);
    FBinFromHex(szEID, (LPBYTE) pbEID);

    hRes = lpMDB->OpenEntry(
        cbEID,
        pbEID,
        0,
        MAPI_BEST_ACCESS,
        &lpObjType,
        (LPUNKNOWN *) lppMessage);
    MAPIFreeBuffer(pbEID);
    if (FAILED(hRes)) return hRes;

    if (lpMDB) lpMDB->Release();
    return hRes;
}
                

Keywords: kbhowto kbmsg KB252649