Compartilhar via


Abra um repositório no servidor remoto quando o Outlook estiver no Modo de Troca armazenado em cache

Aplica-se a: Outlook 2013 | Outlook 2016

Este tópico contém um exemplo de código no C++ que mostra como usar o sinalizador MDB_ONLINE para abrir um repositório de mensagens no servidor remoto quando Microsoft Outlook 2010 ou Microsoft Outlook 2013 estiver no Modo exchange armazenado em cache.

O Modo exchange armazenado em cache permite que o Outlook 2010 e o Outlook 2013 usem uma cópia local da caixa de correio de um usuário, enquanto o Outlook 2010 ou Outlook 2013 mantém uma conexão online com uma cópia remota da caixa de correio do usuário no servidor remoto do Exchange. Quando o Outlook 2010 ou o Outlook 2013 estiver em execução no Modo exchange armazenado em cache, por padrão, todas as soluções MAPI que fazem logon na mesma sessão também são conectadas ao repositório de mensagens armazenado em cache. Todos os dados acessados e quaisquer alterações feitas são feitas na cópia local da caixa de correio.

Um cliente ou provedor de serviços pode substituir a conexão com o repositório de mensagens local e abrir o repositório no servidor remoto definindo o bit para MDB_ONLINE no parâmetro ulFlags ao chamar IMAPISession::OpenMsgStore. Depois que o repositório tiver sido aberto com êxito no servidor remoto para essa sessão, você poderá usar IMAPISession::OpenEntry para abrir itens ou pastas no repositório remoto.

Não é possível abrir um exchange store no modo armazenado em cache e no modo não armazenado em cache ao mesmo tempo na mesma sessão MAPI. Se você já tiver aberto o arquivo de cache mensagens, você deve fechar o repositório antes de abri-lo com esse sinalizador ou abrir uma nova sessão MAPI onde você pode abrir o armazenamento do Exchange no servidor remoto usando esse sinalizador.

O exemplo de código a seguir mostra como chamar IMAPISession::OpenMsgStore com o sinalizador MDB_ONLINE definido no parâmetro ulFlags para abrir o repositório padrão no 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; 
}

Confira também