BaseObj.h 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. /******************************************************************************
  2. |* THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  3. |* ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  4. |* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  5. |* PARTICULAR PURPOSE.
  6. |*
  7. |* Copyright 1995-2005 Nero AG and its licensors. All Rights Reserved.
  8. |*-----------------------------------------------------------------------------
  9. |* NeroSDK / NeroVisionAPI
  10. |*
  11. |* PROGRAM: BaseObj.h
  12. |*
  13. |* PURPOSE: Test application for the NeroVision API: base class for COM objects
  14. ******************************************************************************/
  15. #ifndef BASEOBJ_H
  16. #define BASEOBJ_H
  17. HRESULT GetInterface(LPUNKNOWN pUnk, void **ppv);
  18. class BaseObj: public IUnknown
  19. {
  20. protected:
  21. BaseObj(): m_refCount(1) {}
  22. virtual ~BaseObj() {}
  23. STDMETHODIMP QueryInterface(REFIID riid, void** ppv)
  24. {
  25. if (riid == IID_IUnknown)
  26. return GetInterface(static_cast<IUnknown*>(this), ppv);
  27. else
  28. return InternalQueryInterface(riid, ppv);
  29. }
  30. STDMETHODIMP_(ULONG) AddRef() { return InterlockedIncrement((LONG*)&m_refCount); }
  31. STDMETHODIMP_(ULONG) Release() { ULONG r = InterlockedDecrement((LONG*)&m_refCount); if (r) return r; delete this; return 0; }
  32. virtual HRESULT InternalQueryInterface(REFIID riid, void** ppv) { return E_NOINTERFACE; }
  33. ULONG m_refCount;
  34. };
  35. #define IMPL_IUNKNOWN \
  36. STDMETHODIMP QueryInterface(REFIID riid, void** ppv) { return BaseObj::QueryInterface(riid, ppv); } \
  37. STDMETHODIMP_(ULONG) AddRef() { return BaseObj::AddRef(); } \
  38. STDMETHODIMP_(ULONG) Release() { return BaseObj::Release(); }
  39. #define IMPL_INTERFACE(IFNAME) \
  40. HRESULT InternalQueryInterface(REFIID riid, void** ppv) \
  41. { \
  42. if (riid == __uuidof(IFNAME)) \
  43. return ::GetInterface(static_cast<IFNAME*>(this), ppv); \
  44. else \
  45. return BaseObj::InternalQueryInterface(riid, ppv); \
  46. }
  47. #endif