Я пытаюсь захватить некоторые события Outlook, используя приложение MFC. Я начал с этого Код проекта образец.
Мне удалось захватить отправку и получение сообщений электронной почты, но я не смог захватить ObjectSync.Start / End События. Я верю, что что-то упустил.
Здесь 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);
Ваш код обрабатывает только события приложения. Вам необходимо получить объект SyncObject и подключиться к его событиям (SyncObjectEvents), а не _ApplicationEvents.
Других решений пока нет …