#ifndef APITESTS_UNKNOWNBASE_H #define APITESTS_UNKNOWNBASE_H template class CUnknownBase : public Interface { LONG m_lRef; bool m_AutoDelete; protected: virtual const QITAB* GetQITab() = 0; public: CUnknownBase(bool autoDelete = true, LONG initialRef = 0) : m_lRef(initialRef), m_AutoDelete(autoDelete) { } ULONG STDMETHODCALLTYPE AddRef () { return InterlockedIncrement( &m_lRef ); } ULONG STDMETHODCALLTYPE Release() { long newref = InterlockedDecrement( &m_lRef ); if (m_AutoDelete && newref<=0) { delete this; } return newref; } HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppv) { return QISearch(this, GetQITab(), riid, ppv); } virtual ~CUnknownBase() {} LONG GetRef() const { return m_lRef; } }; #endif // APITESTS_UNKNOWNBASE_H