Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

255 lines
6.4 KiB

//////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2002 Microsoft Corporation
//
// Module Name:
// DispatchHandler.h
//
// Description:
// This file contains a template to use as a base class for an
// implementation of an IDispatch-based interface.
//
// Documentation:
//
// Implementation Files:
// None.
//
// Maintained By:
// John Franco (jfranco) 17-APR-2002
//
//////////////////////////////////////////////////////////////////////////////
// Make sure that this file is included only once per compile path.
#pragma once
//////////////////////////////////////////////////////////////////////////////
// Include Files
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
// Constant Declarations
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
// Template Declarations
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//++
//
// template class TDispatchHandler
//
// Description:
// TDispatchHandler provides a type library-based implementation of
// IDispatch for use by classes that implement a dual interface.
// Instructions for use:
// - inherit from TDispatchHandler< t_Interface > instead of
// directly from t_Interface
// - call HrInit with the type library's GUID when initializing
// each instance
// - return static_cast< TDispatchHandler< t_Interface >* >( this )
// in response to a QueryInterface request for IID_IDispatch.
//
// Template Arguments:
// t_Interface
// The dual interface implemented by the derived class.
// Requirements for t_Interface:
// - has dual attribute in IDL
// - based on IDispatch
// - included in type library
//
//--
//////////////////////////////////////////////////////////////////////////////
template < class t_Interface >
class TDispatchHandler
: public t_Interface
{
private:
ITypeInfo * m_ptypeinfo;
// Private copy constructor to prevent copying.
TDispatchHandler( const TDispatchHandler & );
// Private assignment operator to prevent copying.
TDispatchHandler & operator=( const TDispatchHandler & );
public:
TDispatchHandler( void );
virtual ~TDispatchHandler( void );
virtual HRESULT HrInit( REFGUID rlibid );
STDMETHOD( GetIDsOfNames )(
REFIID riid
, OLECHAR ** rgszNames
, unsigned int cNames
, LCID lcid
, DISPID * rgDispId
);
STDMETHOD( GetTypeInfo )( unsigned int iTInfo, LCID lcid, ITypeInfo ** ppTInfo );
STDMETHOD( GetTypeInfoCount )( unsigned int * pctinfo );
STDMETHOD( Invoke )(
DISPID dispIdMember
, REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS * pDispParams
, VARIANT * pVarResult
, EXCEPINFO * pExcepInfo
, unsigned int * puArgErr
);
}; //*** template class TDispatchHandler
template < class t_Interface >
TDispatchHandler< t_Interface >::TDispatchHandler( void )
: m_ptypeinfo( NULL )
{
} //*** TDispatchHandler< t_Interface >::TDispatchHandler
template < class t_Interface >
TDispatchHandler< t_Interface >::~TDispatchHandler( void )
{
if ( m_ptypeinfo != NULL )
{
m_ptypeinfo->Release();
m_ptypeinfo = NULL;
}
} //*** TDispatchHandler< t_Interface >::~TDispatchHandler
template < class t_Interface >
HRESULT
TDispatchHandler< t_Interface >::HrInit( REFGUID rlibidIn )
{
HRESULT hr = S_OK;
ITypeLib* pitypelib = NULL;
hr = LoadRegTypeLib(
rlibidIn
, 1 // major version number--must match that in IDL
, 0 // minor version number--must match that in IDL
, LOCALE_NEUTRAL
, &pitypelib
);
if ( FAILED( hr ) )
{
goto Cleanup;
}
hr = pitypelib->GetTypeInfoOfGuid( __uuidof( t_Interface ), &m_ptypeinfo );
if ( FAILED( hr ) )
{
goto Cleanup;
}
Cleanup:
if ( pitypelib != NULL )
{
pitypelib->Release();
}
return hr;
} //*** TDispatchHandler< t_Interface >::HrInit
template < class t_Interface >
STDMETHODIMP
TDispatchHandler< t_Interface >::GetIDsOfNames(
REFIID riid
, OLECHAR ** rgszNames
, unsigned int cNames
, LCID lcid
, DISPID * rgDispId
)
{
return m_ptypeinfo->GetIDsOfNames( rgszNames, cNames, rgDispId );
} //*** TDispatchHandler< t_Interface >::GetIDsOfNames
template < class t_Interface >
STDMETHODIMP
TDispatchHandler< t_Interface >::GetTypeInfo(
unsigned int iTInfo
, LCID lcid
, ITypeInfo ** ppTInfo
)
{
HRESULT hr = S_OK;
if ( ppTInfo == NULL )
{
hr = E_POINTER;
goto Cleanup;
}
*ppTInfo = NULL;
if ( iTInfo > 0 )
{
hr = TYPE_E_ELEMENTNOTFOUND;
goto Cleanup;
}
m_ptypeinfo->AddRef();
*ppTInfo = m_ptypeinfo;
Cleanup:
return hr;
} //*** TDispatchHandler< t_Interface >::GetTypeInfo
template < class t_Interface >
STDMETHODIMP
TDispatchHandler< t_Interface >::GetTypeInfoCount(
unsigned int * pctinfo
)
{
HRESULT hr = S_OK;
if ( pctinfo == NULL )
{
hr = THR( E_POINTER );
goto Cleanup;
}
*pctinfo = 1;
Cleanup:
return hr;
} //*** TDispatchHandler< t_Interface >::GetTypeInfoCount
template < class t_Interface >
STDMETHODIMP
TDispatchHandler< t_Interface >::Invoke(
DISPID dispIdMember
, REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS * pDispParams
, VARIANT * pVarResult
, EXCEPINFO * pExcepInfo
, unsigned int * puArgErr
)
{
return m_ptypeinfo->Invoke( this, dispIdMember, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr );
} //*** TDispatchHandler< t_Interface >::Invoke