Я хочу организовать прием событий идущих от COM объекта загруженного в OleConteiner. Обработка события будет происходить в Invoke.
Для начала реализовала класс:
#ifndef UDispatchH
#define UDispatchH
//---------------------------------------------------------------------------
#include <ComCtrls.hpp>
//---------------------------------------------------------------------------
class CMyCoolEventHandler : public IDispatch
{
public:
CMyCoolEventHandler(REFIID idd) : m_idd(idd)
{
}
//CMyCoolEventHandler(){};
virtual ~ CMyCoolEventHandler(){};
STDMETHODIMP_ (DWORD)AddRef();
STDMETHODIMP_ (DWORD)Release();
STDMETHODIMP QueryInterface(REFIID riid, void** ppv);
STDMETHODIMP GetTypeInfoCount(UINT *pctinfo);
STDMETHODIMP GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo);
STDMETHODIMP GetIDsOfNames (REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgdispid);
STDMETHODIMP Invoke(DISPID dispIdMember,
REFIID riid,
LCID lcid,
WORD wFlags,
DISPPARAMS* pDispParams,
VARIANT* pVarResult,
EXCEPINFO * pExcepInfo,
UINT * puArgErr);
private:
REFIID m_idd;
ULONG m_ref;
};
#endif
Реализация класса:
#include <vcl.h>
#pragma hdrstop
#include "UDispatch.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
STDMETHODIMP_ (DWORD)CMyCoolEventHandler::AddRef()
{
return ++m_ref;
}
STDMETHODIMP_ (DWORD)CMyCoolEventHandler::Release()
{
--m_ref;
if(m_ref==0)
{
delete this;
return 0;
}
return m_ref;
}
STDMETHODIMP CMyCoolEventHandler::QueryInterface(REFIID riid, void** ppv)
{
if(riid == IID_IUnknown)
*ppv = (IUnknown*)this;
else if(riid == IID_IDispatch)
*ppv = (IDispatch*)this;
else if(riid == m_idd)
*ppv = this;
else
{
*ppv = NULL;
return E_NOINTERFACE;
}
((IUnknown*)(*ppv))->AddRef();
return S_OK;
}
STDMETHODIMP CMyCoolEventHandler::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
{
ppTInfo = NULL;
return S_OK;
}
STDMETHODIMP CMyCoolEventHandler::GetTypeInfoCount(UINT *pctinfo)
{
*pctinfo = 0;
return S_OK;
}
STDMETHODIMP CMyCoolEventHandler::GetIDsOfNames (REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgdispid)
{
return S_OK;
}
STDMETHODIMP CMyCoolEventHandler::Invoke(DISPID dispIdMember,
REFIID riid,
LCID lcid,
WORD wFlags,
DISPPARAMS* pDispParams,
VARIANT* pVarResult,
EXCEPINFO * pExcepInfo,
UINT * puArgErr)
{
ShowMessage("Произошло событие");
return S_OK;
}
Помогите, пожалуйста, написать код клиента:
//календарь C:\Program Files\Microsoft Office\OFFICE11\MSCAL.OCX
//календарь имеет интрефейс событий DCalendarEvents
//сам код:
//clsid получу от OleConteiner
IConnectionPointContainer* pICPC = NULL;
CoCreateInstance(clsid, NULL, CLSCTX_SERVER, IID_IConnectionPointContainer, (void**)&pICPC);
IConnectionPoint * pCP = NULL;
//здесь первым параметром в FindConnectionPoint надо писать IID_IDispatch или DIID календаря DIID_DCalendarEvents?
pICPC->FindConnectionPoint(Что тут?, &pCP);
ULONG cookie;
//что передать в g_sink(...)?
CMyCoolEventHandler g_sink(Что тут?);
pCP->Advise(&g_sink, &cookie);
//и дальше что пичать?