/****************************************************************************** |* THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF |* ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO |* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A |* PARTICULAR PURPOSE. |* |* Copyright 1995-2005 Nero AG and its licensors. All Rights Reserved. |*----------------------------------------------------------------------------- |* NeroSDK / NeroVisionAPI |* |* PROGRAM: BaseObj.h |* |* PURPOSE: Test application for the NeroVision API: base class for COM objects ******************************************************************************/ #ifndef BASEOBJ_H #define BASEOBJ_H HRESULT GetInterface(LPUNKNOWN pUnk, void **ppv); class BaseObj: public IUnknown { protected: BaseObj(): m_refCount(1) {} virtual ~BaseObj() {} STDMETHODIMP QueryInterface(REFIID riid, void** ppv) { if (riid == IID_IUnknown) return GetInterface(static_cast(this), ppv); else return InternalQueryInterface(riid, ppv); } STDMETHODIMP_(ULONG) AddRef() { return InterlockedIncrement((LONG*)&m_refCount); } STDMETHODIMP_(ULONG) Release() { ULONG r = InterlockedDecrement((LONG*)&m_refCount); if (r) return r; delete this; return 0; } virtual HRESULT InternalQueryInterface(REFIID riid, void** ppv) { return E_NOINTERFACE; } ULONG m_refCount; }; #define IMPL_IUNKNOWN \ STDMETHODIMP QueryInterface(REFIID riid, void** ppv) { return BaseObj::QueryInterface(riid, ppv); } \ STDMETHODIMP_(ULONG) AddRef() { return BaseObj::AddRef(); } \ STDMETHODIMP_(ULONG) Release() { return BaseObj::Release(); } #define IMPL_INTERFACE(IFNAME) \ HRESULT InternalQueryInterface(REFIID riid, void** ppv) \ { \ if (riid == __uuidof(IFNAME)) \ return ::GetInterface(static_cast(this), ppv); \ else \ return BaseObj::InternalQueryInterface(riid, ppv); \ } #endif