Открытие хранилища на удаленном сервере, когда 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;
}