summaryrefslogtreecommitdiffstats
path: root/loader/dshow/iunk.h
diff options
context:
space:
mode:
Diffstat (limited to 'loader/dshow/iunk.h')
-rw-r--r--loader/dshow/iunk.h47
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