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