How to: Open a Store on the Remote Server When Outlook is in Cached Exchange Mode

How to: Open a Store on the Remote Server When Outlook is in Cached Exchange Mode

This topic contains a code sample in C++ that shows how to use the MDB_ONLINE flag to open a message store on the remote server when Microsoft Office Outlook is in Cached Exchange Mode.

Cached Exchange Mode permits Outlook to use a local copy of a user's mailbox while Outlook maintains an online connection to a remote copy of the user's mailbox on the remote Exchange server. When Outlook is running in Cached Exchange Mode, by default, any MAPI solutions that log on to the same session are also connected to the cached message store. Any data that is accessed and any changes that are made are made against the local copy of the mailbox.

A client or service provider can override the connection to the local message store and open the store on the remote server by setting the bit for MDB_ONLINE in the ulFlags parameter when calling IMAPISession::OpenMsgStore. After the store has been successfully opened on the remote server for that session, you can use IMAPISession::OpenEntry to open items or folders on the remote store.

You cannot open an Exchange store in cached mode and in non-cached mode at the same time in the same MAPI session. If you have already opened the cached message store, you must either close the store before you open it with this flag, or open a new MAPI session where you can open the Exchange store on the remote server by using this flag.

The following code sample shows how to call IMAPISession::OpenMsgStore with the MDB_ONLINE flag set in the ulFlags parameter to open the default store on the remote server.

  HRESULT HrRemoteMessageStore(
    LPMAPISESSION lpMAPISession,
    LPMDB* lppMDB)
{
    HRESULT hRes = S_OK;
    LPMAPITABLE pStoresTbl = NULL;
    SRestriction sres = {0};
    SPropValue spv = {0};
    LPSRowSet pRow = NULL;
    LPMDB lpTempMDB = NULL;
    enum {EID,NUM_COLS};
    static SizedSPropTagArray(NUM_COLS,sptCols) = {NUM_COLS,
        PR_ENTRYID,
    };
//Obtain the table of all the message stores that are available
hRes = lpMAPISession->GetMsgStoresTable(0, &pStoresTbl);

if (SUCCEEDED(hRes) && pStoresTbl)
{
    //Set up restrictions for the default store
    sres.rt = RES_PROPERTY;                                  //Comparing a property
    sres.res.resProperty.relop = RELOP_EQ;                   //Testing equality
    sres.res.resProperty.ulPropTag = PR_DEFAULT_STORE;       //Tag to compare
    sres.res.resProperty.lpProp = &spv;                      //Prop tag and value to compare against

    spv.ulPropTag = PR_DEFAULT_STORE;                        //Tag type
    spv.Value.b   = TRUE;                                    //Tag value

    //Convert the table to an array that can be stepped through
    //Only one message store should have PR_DEFAULT_STORE set to true, so that only one will be returned
    hRes = HrQueryAllRows(
        pStoresTbl,                                          //Table to query
        (LPSPropTagArray) &sptCols,                          //Which columns to obtain
        &sres,                                               //Restriction to use
        NULL,                                                //No sort order
        0,                                                   //Max number of rows (0 means no limit)
        &pRow);                                              //Array to return

    if (SUCCEEDED(hRes) && pRow && pRow->cRows)
    {    
        //Open the first returned (default) message store
        hRes = lpMAPISession->OpenMsgStore(
            NULL,                                                //Window handle for dialogs
            pRow->aRow[0].lpProps[EID].Value.bin.cb,             //size and...
            (LPENTRYID)pRow->aRow[0].lpProps[EID].Value.bin.lpb, //value of entry to open
            NULL,                                                //Use default interface (IMsgStore) to open store
            MAPI_BEST_ACCESS | MDB_ONLINE,                       //Flags
            &lpTempMDB);                                         //Pointer to put the store in
        if (SUCCEEDED(hRes) && lppMDB) lppMDB* = lpTempMDB;
    }
}
FreeProws(pRow);
if (pStoresTbl) pStoresTbl->Release();

return hRes;

}

See Also

About MAPI Additions

Additional MAPI Constants

How to: Access a Store on the Remote Server When Outlook is in Cached Exchange Mode