断开脱机状态加载项

适用于:Outlook 2013 | Outlook 2016

当脱机状态加载项已断开连接时,必须实现函数来正确终止和清理加载项。 有关设置和使用脱机状态加载项监视连接状态更改的详细信息,请参阅设置脱机状态加载项使用脱机状态加载项监视连接状态更改

在此主题中,通过使用示例脱机状态加载项的代码示例来演示这些断开连接、终止和清理函数。 示例脱机状态加载项是一个 COM 加载项,它会将脱机状态菜单添加到 Outlook 并使用脱机状态 API。 通过“脱机状态”菜单,可以启用或禁用状态监视、检查当前状态和更改当前状态。 有关下载和安装示例脱机状态加载项的详细信息,请参阅安装示例脱机状态加载项。 有关脱机状态 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 调用 inDeInitMonitorHrRemoveMenuItemsUnloadLibraries 函数以完成脱机状态加载项的清理。

CMyAddin::HrTermAddin() 示例

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

取消初始化监视例程

inDeInitMonitor 函数调用 IMAPIOfflineMgr::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; 
}

另请参阅