次の方法で共有


オフライン状態アドインの切断

適用対象: Outlook 2013 | Outlook 2016

オフライン状態アドインが切断された場合は、アドインを適切に終了してクリーンアップするための関数を実装する必要があります。 接続状態変更の監視を行うためのオフライン状態アドインのセットアップとその使用の詳細については、オフライン状態アドインのセットアップオフライン状態アドインを使用した接続状態変更の監視を参照してください。

このトピックでは、サンプルのオフライン状態アドインのコード例を使って、これらの切断、終了、クリーンアップ関数を説明します。 サンプルのオフライン状態アドインは、オフライン状態 API を使用して Outlook にオフライン状態メニューを追加する COM アドインです。 オフライン状態メニューを使うと、状態の監視を有効または無効にしたり、現在の状態を確認、変更したりすることができます。 サンプルのオフライン状態アドインのダウンロードやインストールの詳細については、サンプルのオフライン状態アドインのインストールを参照してください。 オフライン状態 API の詳細については、オフライン状態 API についてを参照してください。

切断ルーチンについて

オフライン状態アドインがアンロードされると、IDTExtensibility2.OnDisconnection メソッドが呼び出されます。 この関数にはクリーンアップ コードを実装する必要があります。 次の例では、 IDTExtensibility2.OnDisconnection 関数によって 関数が呼び出されます HrTermAddin

CMyAddin::OnDisconnection() の使用例

STDMETHODIMP CMyAddin::OnDisconnection(ext_DisconnectMode /*RemoveMode*/, SAFEARRAY * * /*custom*/) 
{ 
    Log(true,"OnDisconnection\n"); 
    HRESULT hRes = S_OK; 
    hRes = HrTermAddin(); 
     return hRes; 
}

アドイン関数の終了

関数はHrTermAddin、、HrRemoveMenuItems、および UnloadLibraries 関数をinDeInitMonitor呼び出して、オフライン状態アドインのクリーンアップを完了します。

CMyAddin::HrTermAddin() の使用例

HRESULT CMyAddin::HrTermAddin() 
{ 
    HRESULT hRes = S_OK; 
    DeInitMonitor(); 
    hRes =  HrRemoveMenuItems(); 
    UnloadLibraries(); 
    return hRes; 
}

監視ルーチンの非初期化

関数は inDeInitMonitorIMAPIOfflineMgr::Unadvise 関数を呼び出して、オフライン オブジェクトのコールバックを取り消します。

DeInitMonitor() の使用例

void DeInitMonitor() 
{ 
Log(true,_T("Deinitializing Outlook Offline State Monitor\n")); 
HRESULT hRes = S_OK; 
if (g_lpOfflineMgr) 
{ 
hRes = g_lpOfflineMgr->Unadvise(MAPIOFFLINE_UNADVISE_DEFAULT, g_ulAdviseToken); 
g_lpOfflineMgr->Release(); 
g_lpOfflineMgr = NULL; 
g_ulAdviseToken = NULL; 
} 
}

メニュー アイテム ルーチンの削除

関数はHrRemoveMenuItems、[オフライン状態] メニューの下の各メニュー項目を呼び出DispEventUnadviseし、[オフライン状態] メニューを削除します。

CMyAddin::HrRemoveMenuItems() の使用例

HRESULT CMyAddin::HrRemoveMenuItems() 
{     
    Log(true,"HrRemoveMenuItems\n"); 
    HRESULT hRes = S_OK; 
    if (m_fMenuItemsAdded) 
    { 
        try 
        { 
            if (m_spInitButton) 
            { 
                m_InitButtonHandler.DispEventUnadvise(m_spInitButton); 
            } 
            if (m_spDeinitButton) 
            { 
                m_DeinitButtonHandler.DispEventUnadvise(m_spDeinitButton); 
            } 
            if (m_spGetStateButton) 
            { 
                m_GetStateButtonHandler.DispEventUnadvise(m_spGetStateButton); 
            } 
            if (m_spSetStateButton) 
            { 
                m_SetStateButtonHandler.DispEventUnadvise(m_spSetStateButton); 
            } 
 
            m_spMyMenu->Delete(); 
        } 
        catch(_com_error) 
        { 
            hRes = E_FAIL; 
        } 
        if (SUCCEEDED(hRes)) 
        { 
            m_fMenuItemsAdded = false; 
        } 
    } 
    return hRes; 
}

ライブラリ ルーチンのアンロード

アドインが Outlook からアンロードされると、 UnloadLibraries 関数はアドインに必要なダイナミック リンク ライブラリ (DLL) をアンロードします。

UnloadLibraries() の使用例

void UnloadLibraries() 
{ 
    Log(true,_T("UnloadLibraries - freeing modules\n")); 
    pfnHrOpenOfflineObj = NULL; 
    pfnMAPIFreeBuffer = NULL; 
    if (hModMSMAPI) FreeLibrary(hModMSMAPI); 
    hModMSMAPI = NULL; 
    if (hModMAPI) FreeLibrary(hModMAPI); 
    hModMAPI = NULL; 
    if (hModMAPIStub) FreeLibrary(hModMAPIStub); 
    hModMAPIStub = NULL; 
}

関連項目