Compartir a través de


Abrir un almacén en el servidor remoto cuando Outlook está en modo de intercambio almacenado en caché

Hace referencia a: Outlook 2013 | Outlook 2016

Este tema contiene un ejemplo de código en C++ que muestra cómo usar la marca MDB_ONLINE para abrir un almacén de mensajes en el servidor remoto cuando Microsoft Outlook 2010 o Microsoft Outlook 2013 está en modo de intercambio almacenado en caché.

El modo de intercambio almacenado en caché permite que Outlook 2010 y Outlook 2013 usen una copia local del buzón de un usuario, mientras que Outlook 2010 o Outlook 2013 mantiene una conexión en línea a una copia remota del buzón del usuario en el servidor remoto de Exchange. Cuando Outlook 2010 o Outlook 2013 se ejecuta en modo de intercambio almacenado en caché, de forma predeterminada, las soluciones MAPI que inician sesión en la misma sesión también se conectan al almacén de mensajes almacenados en caché. Los datos a los que se accede y los cambios realizados se realizan en la copia local del buzón.

Un cliente o proveedor de servicios puede invalidar la conexión al almacén de mensajes local y abrir el almacén en el servidor remoto estableciendo el bit para MDB_ONLINE en el parámetro ulFlags al llamar a IMAPISession::OpenMsgStore. Una vez que el almacén se ha abierto correctamente en el servidor remoto para esa sesión, puede usar IMAPISession::OpenEntry para abrir elementos o carpetas en el almacén remoto.

No se puede abrir un almacén de Exchange en modo almacenado en caché y en modo no almacenado en caché al mismo tiempo en la misma sesión MAPI. Si ya ha abierto el almacén de mensajes en modo caché, debe cerrar el almacén antes de abrirlo con esta marca o abrir una nueva sesión MAPI donde puede abrir el almacén de Exchange en el servidor remoto mediante este marcador.

En el ejemplo de código siguiente se muestra cómo llamar a IMAPISession::OpenMsgStore con la marca MDB_ONLINE establecida en el parámetro ulFlags para abrir el almacén predeterminado en el servidor remoto.

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; 
}

Vea también