Приемник событий
От: Kitty  
Дата: 13.06.07 14:37
Оценка:
Я хочу организовать прием событий идущих от 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);

//и дальше что пичать?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.