断开脱机状态加载项
适用于: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
调用 inDeInitMonitor
、 HrRemoveMenuItems
和 UnloadLibraries
函数以完成脱机状态加载项的清理。
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;
}