Outlook が Exchange キャッシュ モードの場合にリモート サーバーでストアを開く
適用対象: Outlook 2013 | Outlook 2016
このトピックには、Microsoft Outlook 2010または Microsoft Outlook 2013 が Exchange キャッシュ モードのときに、MDB_ONLINE フラグを使用してリモート サーバー上のメッセージ ストアを開く方法を示す C++ のコード サンプルが含まれています。
Exchange キャッシュ モードを使用すると、Outlook 2010 と Outlook 2013 はユーザーのメールボックスのローカル コピーを使用でき、Outlook 2010 または Outlook 2013 はリモート Exchange サーバー上のユーザーのメールボックスのリモート コピーへのオンライン接続を維持します。 Outlook 2010 または Outlook 2013 が Exchange キャッシュ モードで実行されている場合、既定では、同じセッションにログオンするすべての MAPI ソリューションも、キャッシュされたメッセージ ストアに接続されます。 アクセスされたデータと行われた変更は、メールボックスのローカル コピーに対して行われます。
クライアントまたはサービス プロバイダーは、IMAPISession::OpenMsgStore を呼び出すときに ulFlags パラメーターでMDB_ONLINEビットを設定することで、ローカル メッセージ ストアへの接続をオーバーライドし、リモート サーバー上でストアを開くことができます。 そのセッションのリモート サーバーでストアが正常に開かれたら、 IMAPISession::OpenEntry を使用してリモート ストア上のアイテムまたはフォルダーを開くことができます。
同じ MAPI セッションで、Exchange ストアをキャッシュ モードと非キャッシュ モードで同時に開くことはできません。 キャッシュ済みのメッセージ ストアを既に開いている場合は、このフラグを使用してストアを開く前にストアを閉じるか、このフラグを使用してリモート サーバー上の Exchange ストアを開くことができる新しい MAPI セッションを開く必要があります。
次のコード サンプルは、MDB_ONLINE フラグをulFlags パラメーターに設定して IMAPISession::OpenMsgStore を呼び出して、リモート サーバー上の既定のストアを開く方法を示しています。
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;
}