162 lines
5.1 KiB
C
162 lines
5.1 KiB
C
|
/*++
|
||
|
|
||
|
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 base, class CComThreadingModel = CComMultiThreadModel>
|
||
|
class CTAPIComObjectRoot :
|
||
|
public CComObjectRootEx<CComThreadingModel>
|
||
|
{
|
||
|
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 base>
|
||
|
class CTAPIComDispatchObject :
|
||
|
public CComObjectRootEx<CComMultiThreadModel>,
|
||
|
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
|
||
|
|