/*++ Copyright (c) 1998-1999 Microsoft Corporation Module Name: tapibase.h Abstract: Declaration of the CTAPIComObjectRoot template Author: mquinton 09-23-98 Notes: Revision History: --*/ #ifndef __TAPIBASE_H__ #define __TAPIBASE_H__ template class CTAPIComObjectRoot : public CComObjectRootEx { protected: IUnknown * m_pFTM; public: CTAPIComObjectRoot() { m_pFTM = NULL; } ~CTAPIComObjectRoot() { // // release the free threaded marshaller // if ( NULL != m_pFTM ) { m_pFTM->Release(); } } //virtual HRESULT WINAPI IMarshalQI( void * pv, REFIID riid, LPVOID * ppv, DWORD_PTR dw )= 0; }; template class CTAPIComDispatchObject : public CComObjectRootEx, public IDispatch { protected: base * m_pBase; public: virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject); virtual ULONG STDMETHODCALLTYPE AddRef(); virtual ULONG STDMETHODCALLTYPE Release(); void Initialize( base * p ) { m_pBase = p; m_pBase->AddRef(); } void helpme() { const _ATL_INTMAP_ENTRY* pEntries = m_pBase->_GetEntries(); while ( pEntries->pFunc != NULL ) { if (pEntries->pFunc == _ATL_SIMPLEMAPENTRY) { IDispatch * pDisp = (IDispatch*)((LONG_PTR)m_pBase+pEntries->dw); } pEntries++; } } STDMETHOD(GetTypeInfoCount)(UINT * pctinfo); STDMETHOD(GetTypeInfo)( UINT iTInfo, LCID lcid, ITypeInfo ** ppTInfo ); STDMETHOD(GetIDsOfNames)( REFIID riid, LPOLESTR * rgszNames, UINT cNames, LCID lcid, DISPID * rgDispId ); STDMETHOD(Invoke)( DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS * pDispParams, VARIANT * pVarResult, EXCEPINFO * pExcepInfo, UINT * puArgErr ); }; #define DECLARE_MARSHALQI(__base__) \ static HRESULT WINAPI IMarshalQI( void * pv, REFIID riid, LPVOID * ppv, DWORD_PTR dw ) \ { \ HRESULT hr; \ IUnknown * pUnk; \ \ __base__ * pObject = (__base__ *)pv; \ \ *ppv = NULL; \ \ pObject->Lock(); \ \ if ( NULL == pObject->m_pFTM ) \ { \ pObject->_InternalQueryInterface(IID_IUnknown, (void **)&pUnk); \ \ hr = CoCreateFreeThreadedMarshaler( \ pUnk, \ &(pObject->m_pFTM) \ ); \ \ pUnk->Release(); \ \ if ( !SUCCEEDED(hr) ) \ { \ pObject->Unlock(); \ \ return E_NOINTERFACE; \ } \ } \ \ pObject->Unlock(); \ \ return S_FALSE; \ } \ #endif