#if !defined( __sinkimpl_h_INCLUDED__ )
#define __sinkimpl_h_INCLUDED__
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
template < typename
T, typename
EventInterface, const
GUID * evtLibID = NULL >
class
ATL_NO_VTABLE CSinkImpT
: public
CComObjectRootEx<CComSingleThreadModel>
, public
CComCoClass<CSinkImpT<T, EventInterface, evtLibID>, &__uuidof(T)>
, public
IDispatchImpl < EventInterface, &__uuidof(EventInterface), evtLibID >
{
public :
CSinkImpT() {}
virtual
~CSinkImpT() {}
typedef
IDispatchImpl<EventInterface, &__uuidof(EventInterface), evtLibID> _parentClass;
typedef
CSinkImpT<T, EventInterface, evtLibID> _thisClass;
STDMETHOD( Invoke )(DISPID dispidMember, REFIID riid,
LCID
lcid, WORD
wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult,
EXCEPINFO* pexcepinfo, UINT * puArgErr)
{
T * pThis = static_cast <T *>( this );
return
pThis->DoInvoke( dispidMember, riid,
lcid, wFlags, pdispparams, pvarResult,
pexcepinfo, puArgErr );
}
DECLARE_NO_REGISTRY()
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP( _thisClass )
COM_INTERFACE_ENTRY( IDispatch )
COM_INTERFACE_ENTRY( EventInterface )
END_COM_MAP();
STDMETHOD( DoInvoke )(DISPID dispidMember, REFIID riid,
LCID
lcid, WORD
wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult,
EXCEPINFO* pexcepinfo, UINT * puArgErr)
{
return
_parentClass::Invoke( dispidMember, riid,
lcid, wFlags, pdispparams, pvarResult,
pexcepinfo, puArgErr );
}
};
///////////////////////////////////////////////////////////////////////////////////////////////////////
// ComDllLib::ITestComPtr pCom;
// HRESULT hr = pCom.CreateInstance( L"Test.Com" );
// ConnectionPointHelper<ComDllLib::ITestCom, ComDllLib::_ITestComEvent, CSink3> cph( pCom );
//
template < typename
EventInterface, typename
EventProcessor>
class
ConnectionPointHelper
{
CComPtr<IUnknown> m_spInterface;
DWORD
m_dwCookie;
public :
ConnectionPointHelper( IUnknown* pInterface ) : m_spInterface( pInterface ), m_dwCookie( 0 ) { Connect(); }
~ConnectionPointHelper() { Disconnect(); }
protected :
void
Connect()
{
HRESULT
hr = E_FAIL;
do
{
if
( m_spInterface == NULL || m_dwCookie != 0 ) { break ; }
CComObject<EventProcessor> * pTmp = NULL;
hr = CComObject<EventProcessor>::CreateInstance( &pTmp );
if
( FAILED( hr ) ){ break ; }
CComQIPtr<IUnknown, &IID_IUnknown> spSink( pTmp );
hr = m_spInterface.Advise( spSink, __uuidof(EventInterface), &m_dwCookie );
} while
( FALSE );
}
void
Disconnect()
{
HRESULT
hr = E_FAIL;
do
{
if
( m_dwCookie == 0 ) { break ; }
AtlUnadvise( m_spInterface, __uuidof(EventInterface), m_dwCookie );
m_dwCookie = 0;
} while
( FALSE );
}
};
#endif // !defined( __sinkimpl_h_INCLUDED__ )
|