#ifndef _iunk_h #define _iunk_h #include "interfaces.h" #include "guids.h" #define DECLARE_IUNKNOWN(CLASSNAME) \ int refcount; \ static long STDCALL QueryInterface (IUnknown * This, GUID* riid, void **ppvObject); \ static long STDCALL AddRef (IUnknown * This); \ static long STDCALL Release (IUnknown * This); #define IMPLEMENT_IUNKNOWN(CLASSNAME) \ long STDCALL CLASSNAME ::QueryInterface (IUnknown * This, GUID* riid, void **ppvObject) \ { \ Debug printf(#CLASSNAME "::QueryInterface() called\n");\ if(!ppvObject)return 0x80004003; \ CLASSNAME * me=( CLASSNAME *)This; \ int i=0; \ for(const GUID* r=me->interfaces; ivt->AddRef((IUnknown*)This); \ *ppvObject=This; \ return 0; \ } \ Debug printf("Failed\n"); \ return 0x80004002; \ } \ \ long STDCALL CLASSNAME ::AddRef ( \ IUnknown * This) \ { \ Debug printf(#CLASSNAME "::AddRef() called\n"); \ CLASSNAME * me=( CLASSNAME *)This; \ return ++(me->refcount); \ } \ \ long STDCALL CLASSNAME ::Release ( \ IUnknown * This) \ { \ Debug printf(#CLASSNAME "::Release() called\n"); \ CLASSNAME* me=( CLASSNAME *)This; \ if(--(me->refcount) ==0) \ delete ( CLASSNAME *) This; \ return 0; \ } #endif