51 lines
1.3 KiB
C++
51 lines
1.3 KiB
C++
#ifndef __COMOBJECTEMBED_H_
|
|
#define __COMOBJECTEMBED_H_
|
|
|
|
|
|
template <class Base> //Base must be derived from CComObjectRoot
|
|
class CComObjectEmbed : public Base
|
|
{
|
|
public:
|
|
typedef Base _BaseClass;
|
|
|
|
CComObjectEmbed() {m_pOuterUnknown = NULL;}
|
|
CComObjectEmbed(void* pv) {m_pOuterUnknown = (IUnknown*)pv;}
|
|
void SetOuterUnknown(IUnknown *punkContainer) {m_pOuterUnknown = punkContainer;}
|
|
|
|
#ifdef xx_ATL_DEBUG_INTERFACES
|
|
~CComObjectEmbed()
|
|
{
|
|
_Module.DeleteNonAddRefThunk(_GetRawUnknown());
|
|
_Module.DeleteNonAddRefThunk(m_pOuterUnknown);
|
|
}
|
|
#endif
|
|
|
|
STDMETHOD_(ULONG, AddRef)() {return OuterAddRef();}
|
|
STDMETHOD_(ULONG, Release)() {return OuterRelease();}
|
|
STDMETHOD(QueryInterface)(REFIID iid, void ** ppvObject)
|
|
{
|
|
return _InternalQueryInterface(iid, ppvObject);
|
|
}
|
|
template <class Q>
|
|
HRESULT STDMETHODCALLTYPE QueryInterface(Q** pp)
|
|
{
|
|
return QueryInterface(__uuidof(Q), (void**)pp);
|
|
}
|
|
|
|
//GetControllingUnknown may be virtual if the Base class has declared
|
|
//DECLARE_GET_CONTROLLING_UNKNOWN()
|
|
IUnknown* GetControllingUnknown()
|
|
{
|
|
#ifdef xx_ATL_DEBUG_INTERFACES
|
|
IUnknown* p;
|
|
_Module.AddNonAddRefThunk(m_pOuterUnknown, _T("CComObjectEmbed"), &p);
|
|
return p;
|
|
#else
|
|
return m_pOuterUnknown;
|
|
#endif
|
|
}
|
|
};
|
|
|
|
|
|
#endif /* !__COMOBJECTEMBED_H_ */
|