2013-10-24 87 views
4

我想捕獲使用MFC應用程序的一些Outlook事件。我從這個Code Project樣本開始。 我設法捕獲電子郵件發送和接收事件,但我無法捕獲ObjectSync.Start/End事件。我相信我錯過了一些東西。捕獲Outlook事件

這裏是的QueryInterface方法:

STDMETHODIMP CAppEventListener::QueryInterface(REFIID riid, 
              void ** ppvObj) 
{ 
    if (riid == IID_IUnknown){*ppvObj = static_cast<IUnknown*>(this);} 
    else 
     if (riid == IID_IDispatch){*ppvObj = static_cast<IDispatch*>(this);} 
     else 
      if (riid == IID_ApplicationEvents){*ppvObj = static_cast<IDispatch*>(this);} 
      else {*ppvObj = NULL;return E_NOINTERFACE;} 
    static_cast<IUnknown*>(*ppvObj)->AddRef(); 
    return S_OK; 
} 

這裏是調用方法

STDMETHODIMP CAppEventListener::Invoke(DISPID dispIdMember, 
         REFIID riid, LCID lcid, 
         WORD wFlags, DISPPARAMS* pDispParams, 
         VARIANT* pVarResult, EXCEPINFO* pExcepInfo, 
         UINT* puArgErr) 
{ 
    //declaratin of l_date and l_time    
    switch(dispIdMember) 
    {  
     case 0x0000fba7: HandleItemLoad(dispIdMember,l_date ,l_time); 
       break; 

     case 0x0000fab5: HandleOnReceive(riid,pDispParams,l_date ,l_time); 
        break; 

     case 0x0000f002: HandleOnSend(riid,pDispParams,l_date ,l_time); 
       break; 

     case 0x0000fb40: HandleContextMenuDis(dispIdMember,l_date ,l_time); 
       break; 

     case 0x0000fba6: HandleContextMenuClo(dispIdMember,l_date ,l_time); 
        break; 

     case 0x0000f006: HandleStartup(dispIdMember,l_date ,l_time); 
       break; 

     case 0x0000f007: HandleQuit(dispIdMember,l_date ,l_time); 
       break; 

     default:   HandleUnknown(dispIdMember,l_date ,l_time); 
        break; 
    } 
    return S_OK; 
} 

這裏是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; 
} 

任何幫助,將不勝感激。


更新1:

現在我有一個SyncObjectEvents

class CSyncObjectEventListener : public IDispatch 

這裏的包裝類是我AttachToSource方法:

HRESULT STDMETHODCALLTYPE CSyncObjectEventListener::AttachToSource(IUnknown* pEventSource) 
{ 
    HRESULT hr = S_OK; 

    IConnectionPointContainer* pCPC = NULL; 
    hr = pEventSource->QueryInterface(IID_IConnectionPointContainer, 
     (void**)&pCPC); 
    if (SUCCEEDED(hr)) 
    { 
     HRESULT hr = pCPC->FindConnectionPoint(IID_SyncObjectEvents, &m_pConnectionPoint);    
     //Failure 
     if (SUCCEEDED(hr)) 
     { 
     hr = m_pConnectionPoint->Advise(this, &m_dwConnection); 
     } 
     pCPC->Release(); 
    } 

    return hr; 
} 

IID_SyncObjectEvents定義如下:

const IID IID_SyncObjectEvents = {0x00063005,0x0000,0x0000,{0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}}; 

FindConnectionPoint方法無法連接。


更新2:

我還有一個叫ObjectSync類:class CObjectSync : public COleDispatchDriver 而在CSyncObjectEventListener類我有這個屬性public : CObjectSync m_pObjectSync;

這裏是與我的代碼試圖連接。

m_pSyncObjectEventListener = new CSyncObjectEventListener(); 
if(!m_pSyncObjectEventListener->m_pObjectSync.CreateDispatch(_T("Outlook.SyncObjects"),&l_oleExcep)) 
{ 
    return 0; 
} 

m_pSyncObjectEventListener->AddRef(); 
m_pSyncObjectEventListener->AttachToSource(m_pSyncObjectEventListener->m_pObjectSync.m_lpDispatch); 

回答

4

您的代碼僅處理應用程序事件。您需要檢索SyncObject對象並連接到它的事件(SyncObjectEvents),而不是_ApplicationEvents。

+1

有可能連接到這兩個事件我猜?不是嗎? – user12

+1

來自相同的包裝類?如果事件發生衝突會怎樣?你真的需要創建一個不同的包裝類(CSyncObjectEventListener?),它使用IID_SyncObjectEvenst接口和特定的接口。 –

+0

好的,謝謝。我會嘗試製作一個新的包裝類,我會回來接受你的答案,一旦我收到我想要的通知;) – user12