我正在开发一个与MS Outlook(2007& 2010)通信的应用程序(单独的.exe)并捕获一些事件。使用Outlook 2010一切正常,但是在Outlook 2007中我注意到当我关闭Outlook时,只有窗口被关闭,Outlook进程一直在运行。在显示任何代码之前,我想知道是否有人知道这种行为会从何而来? N.B,当我关闭我的应用程序时,Outlook进程已停止。
此link讨论类似问题
的更新 的
e.g: 以下是我捕获应用程序事件的方法:(在我的主线程中)
CAppEventListener m_pAppEventListener = new CAppEventListener();
m_pAppEventListener->Initialize();
以下是如何定义Initialize方法:
void CAppEventListener::Initialize()
{
COleException l_oleExcep;
BOOL bResult = m_OutlookApplicationInternal.CreateDispatch( _T("Outlook.Application"),&l_oleExcep );
//m_LogTrace = new CLogTrace();
//m_LogTrace->OnStartup(TRUE, TRUE);
if ( !bResult )
{
//CString l_csError;
//l_csError.Format("0x%08lx",l_oleExcep.m_sc);
//m_LogTrace->WriteLine("\tERROR\tEchec lors de l'appel de \"Create Dispatch\" code erreur "+l_csError);
//m_LogTrace->WriteLine("\tINFO\tFermeture d'IAOutlookMonior");
exit(0);
}
AddRef();
HRESULT hr = AttachToSource(m_OutlookApplicationInternal.m_lpDispatch );
//m_LogTrace->WriteLine(_T("\tINFO\tSuccès de connexion à Outlook"));
}
这是AttachToSource方法
STDMETHODIMP CAppEventListener::AttachToSource
( IUnknown* pEventSource )
{
HRESULT hr = S_OK;
IConnectionPointContainer* pCPC = NULL;
hr = pEventSource->QueryInterface( IID_IConnectionPointContainer, (void**)&pCPC );
if (SUCCEEDED(hr))
{
hr = pCPC->FindConnectionPoint( IID_ApplicationEvents, &m_pConnectionPoint );
if (SUCCEEDED(hr))
{
hr = m_pConnectionPoint->Advise( this, &m_dwConnection );
}
pCPC->Release();
}
return hr;
}
CAppEventListener
实现IDispatch
接口。 m_OutlookApplicationInternal
对象是CApplication
类的实例。
我应该如何处理它?</ p>
更新2
如果我的应用程序进程在释放对outlook对象的引用之前被意外杀死,那么Outlook会继续运行吗?我该如何处理这个问题?
答案 0 :(得分:2)
Outlook仍在运行,因为您仍然引用了Outlook对象,因此它正在运行,以便为您的应用程序可能提出的任何请求提供服务。
您需要计算Outlook已打开的窗口(Explorers和Inspectors)的数量。此数字可从Outlook对象模型中获得。
当此数字达到零时,您的申请应该退出。
或者,有一个Application_Quit事件。您应该处理该事件并在事件发生时退出。
答案 1 :(得分:2)
您需要确保不会长时间保留对任何Outlook对象的未完成引用 - 将所有变量设置为方法的本地变量,创建Outlook.Application对象的实例等。只要您是完成后,释放所有对象(Marshal.ReleaseComObjects,如果你使用.Net效果很好)。