#ifndef __COMOBJECTEMBED_H_ #define __COMOBJECTEMBED_H_ template //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 _ATL_DEBUG_INTERFACES ~CComObjectEmbed() { _Module.DeleteNonAddRefThunk(_GetRawUnknown()); _Module.DeleteNonAddRefThunk(m_pOuterUnknown); FinalRelease(); } #else ~CComObjectEmbed() { FinalRelease(); } #endif STDMETHOD_(ULONG, AddRef)() {return OuterAddRef();} STDMETHOD_(ULONG, Release)() {return OuterRelease();} STDMETHOD(QueryInterface)(REFIID iid, void ** ppvObject) { return _InternalQueryInterface(iid, ppvObject); } template 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 _ATL_DEBUG_INTERFACES IUnknown* p; _Module.AddNonAddRefThunk(m_pOuterUnknown, _T("CComObjectEmbed"), &p); return p; #else return m_pOuterUnknown; #endif } }; #endif /* !__COMOBJECTEMBED_H_ */