diff options
Diffstat (limited to 'loader/dshow/iunk.h')
-rw-r--r-- | loader/dshow/iunk.h | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/loader/dshow/iunk.h b/loader/dshow/iunk.h new file mode 100644 index 0000000000..cf07e9cea5 --- /dev/null +++ b/loader/dshow/iunk.h @@ -0,0 +1,47 @@ +#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; i<sizeof(CLASSNAME ::interfaces)/sizeof(CLASSNAME ::interfaces[0]); r++, i++) \ + if(!memcmp(r, riid, 16)) \ + { \ + This->vt->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 |