Öffnen eines Speichers auf dem Remoteserver, wenn Outlook sich im Exchange-Cachemodus befindet
Gilt für: Outlook 2013 | Outlook 2016
Dieses Thema enthält ein Codebeispiel in C++, das zeigt, wie sie das MDB_ONLINE-Flag verwenden, um einen Nachrichtenspeicher auf dem Remoteserver zu öffnen, wenn sich Microsoft Outlook 2010 oder Microsoft Outlook 2013 im Exchange-Cachemodus befindet.
Im Exchange-Cachemodus können Outlook 2010 und Outlook 2013 eine lokale Kopie des Postfachs eines Benutzers verwenden, während Outlook 2010 oder Outlook 2013 eine Onlineverbindung mit einer Remotekopie des Postfachs des Benutzers auf dem Exchange-Remoteserver aufrechterhält. Wenn Outlook 2010 oder Outlook 2013 im Exchange-Cachemodus ausgeführt wird, sind standardmäßig alle MAPI-Lösungen, die sich bei derselben Sitzung anmelden, ebenfalls mit dem zwischengespeicherten Nachrichtenspeicher verbunden. Alle Daten, auf die zugegriffen wird, und alle vorgenommenen Änderungen werden an der lokalen Kopie des Postfachs vorgenommen.
Ein Client oder Dienstanbieter kann die Verbindung mit dem lokalen Nachrichtenspeicher überschreiben und den Speicher auf dem Remoteserver öffnen, indem er beim Aufrufen von IMAPISession::OpenMsgStore das Bit für MDB_ONLINE im ulFlags-Parameter festlegt. Nachdem der Speicher auf dem Remoteserver für diese Sitzung erfolgreich geöffnet wurde, können Sie IMAPISession::OpenEntry verwenden, um Elemente oder Ordner im Remotespeicher zu öffnen.
Sie können einen Exchange-Speicher nicht gleichzeitig in derselben MAPI-Sitzung im zwischengespeicherten Modus und im nicht zwischengespeicherten Modus öffnen. Wenn Sie den zwischengespeicherten Nachrichtenspeicher bereits geöffnet haben, müssen Sie entweder den Speicher schließen, bevor Sie ihn mit dieser Kennzeichnung öffnen, oder eine neue MAPI-Sitzung öffnen, in der Sie den Exchange-Speicher auf dem Remoteserver mit dieser Kennzeichnung öffnen können.
Im folgenden Codebeispiel wird gezeigt, wie IMAPISession::OpenMsgStore mit dem imulFlags-Parameter festgelegten MDB_ONLINE-Flag aufgerufen wird, um den Standardspeicher auf dem Remoteserver zu öffnen.
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;
}