Outlook进程无法退出

时间:2014-03-06 15:37:34

标签: c++ outlook

我正在开发一个与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会继续运行吗?我该如何处理这个问题?

2 个答案:

答案 0 :(得分:2)

Outlook仍在运行,因为您仍然引用了Outlook对象,因此它正在运行,以便为您的应用程序可能提出的任何请求提供服务。

您需要计算Outlook已打开的窗口(Explorers和Inspectors)的数量。此数字可从Outlook对象模型中获得。

当此数字达到零时,您的申请应该退出。

或者,有一个Application_Quit事件。您应该处理该事件并在事件发生时退出。

答案 1 :(得分:2)

您需要确保不会长时间保留对任何Outlook对象的未完成引用 - 将所有变量设置为方法的本地变量,创建Outlook.Application对象的实例等。只要您是完成后,释放所有对象(Marshal.ReleaseComObjects,如果你使用.Net效果很好)。