Share via


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

関連項目