Поделиться через


Открытие хранилища на удаленном сервере, когда Outlook находится в режиме кэширования Exchange

Область применения: Outlook 2013 | Outlook 2016

В этом разделе содержится пример кода на C++, в котором показано, как использовать флаг MDB_ONLINE для открытия хранилища сообщений на удаленном сервере, когда Microsoft Outlook 2010, русская версия или Microsoft Outlook 2013 находится в режиме кэширования Exchange.

Режим кэширования Exchange позволяет Outlook 2010 и Outlook 2013 использовать локальную копию почтового ящика пользователя, а Outlook 2010 или Outlook 2013 поддерживает подключение к удаленной копии почтового ящика пользователя на удаленном сервере Exchange Server. Если Outlook 2010 или Outlook 2013 работает в режиме кэширования Exchange, по умолчанию все решения MAPI, которые входят в тот же сеанс, также подключаются к кэшированному хранилищу сообщений. Все данные, к которым осуществляется доступ, и внесенные изменения вносятся в локальную копию почтового ящика.

Клиент или поставщик услуг может переопределить подключение к локальному хранилищу сообщений и открыть хранилище на удаленном сервере, задав бит для MDB_ONLINE в параметре ulFlags при вызове IMAPISession::OpenMsgStore. После успешного открытия хранилища на удаленном сервере для этого сеанса можно использовать IMAPISession::OpenEntry для открытия элементов или папок в удаленном хранилище.

Вы не можете открыть хранилище Exchange в кэшированном режиме и в не кэшированном режиме одновременно в том же сеансе MAPI. Если вы уже открыли хранилище кэшированных сообщений, потребуется его закрыть перед открытием с этим флагом или открыть новый сеанс MAPI, в котором можно будет открыть хранилище Exchange на удаленном сервере с использованием этого флага.

В следующем примере кода показано, как вызвать IMAPISession::OpenMsgStore с флагом MDB_ONLINE , заданным в параметре ulFlags , чтобы открыть хранилище по умолчанию на удаленном сервере.

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

См. также