我想捕獲使用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);
有可能連接到這兩個事件我猜?不是嗎? – user12
來自相同的包裝類?如果事件發生衝突會怎樣?你真的需要創建一個不同的包裝類(CSyncObjectEventListener?),它使用IID_SyncObjectEvenst接口和特定的接口。 –
好的,謝謝。我會嘗試製作一個新的包裝類,我會回來接受你的答案,一旦我收到我想要的通知;) – user12