mirror of https://github.com/mpv-player/mpv
48 lines
1.4 KiB
C
48 lines
1.4 KiB
C
|
#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
|