25#include <winpr/platform.h>
26#include <winpr/winpr.h>
27#include <winpr/wtypes.h>
28#include <winpr/error.h>
71#define WINPR_COM_CALL __stdcall
87 (
wIUnknown* This,
const IID* riid,
void** ppvObject);
96#if defined(__cplusplus) && !defined(WINPR_COM_CINTERFACE)
100 virtual HRESULT
WINPR_COM_CALL QueryInterface(
const IID* riid,
void** ppvObject) = 0;
122#define WINPR_COM_DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
123 static const GUID name = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }
127 0x00, 0x00, 0x00, 0x46);
132 return memcmp(a, b,
sizeof(*a)) == 0;
137#define WINPR_COM_GUID_FMT \
138 "{%08" PRIX32 "-%04" PRIX16 "-%04" PRIX16 "-%02" PRIX8 "%02" PRIX8 "-%02" PRIX8 "%02" PRIX8 \
139 "%02" PRIX8 "%02" PRIX8 "%02" PRIX8 "%02" PRIX8 "}"
140#define WINPR_COM_GUID_ARGS(g) \
141 (UINT32)(g)->Data1, (UINT16)(g)->Data2, (UINT16)(g)->Data3, (g)->Data4[0], (g)->Data4[1], \
142 (g)->Data4[2], (g)->Data4[3], (g)->Data4[4], (g)->Data4[5], (g)->Data4[6], (g)->Data4[7]
146#define WINPR_COM_IUNKNOWN_VTBL(obj) ((const wIUnknownVtbl*)(obj)->lpVtbl)
150#define WINPR_COM_QUERY_INTERFACE(obj, iid, ppv) \
151 (WINPR_COM_IUNKNOWN_VTBL(obj)->QueryInterface((wIUnknown*)(obj), (iid), (void**)(ppv)))
152#define WINPR_COM_ADDREF(obj) (WINPR_COM_IUNKNOWN_VTBL(obj)->AddRef((wIUnknown*)(obj)))
153#define WINPR_COM_RELEASE(obj) (WINPR_COM_IUNKNOWN_VTBL(obj)->Release((wIUnknown*)(obj)))
190 volatile LONG refCount;
191 const char* className;
219#define WINPR_COM_REFCOUNT_THUNKS(prefix) \
220 static ULONG WINPR_COM_CALL prefix##_AddRef(wIUnknown* This) \
222 return winpr_com_base_add_ref((wComBase*)This); \
224 static ULONG WINPR_COM_CALL prefix##_Release(wIUnknown* This) \
226 return winpr_com_base_release((wComBase*)This); \
231#define WINPR_COM_IUNKNOWN_THUNKS(prefix, iid) \
232 static HRESULT WINPR_COM_CALL prefix##_QueryInterface(wIUnknown* This, const IID* riid, \
235 return winpr_com_base_query((wComBase*)This, (iid), riid, ppvObject); \
237 WINPR_COM_REFCOUNT_THUNKS(prefix)
241#define WINPR_COM_IUNKNOWN_ENTRIES(prefix) \
242 { prefix##_QueryInterface, prefix##_AddRef, prefix##_Release }
void(* pfnwComBaseFree)(wComBase *object)
called when the last reference goes away: releases what the object holds and frees it
static BOOL winpr_com_guid_equal(const GUID *a, const GUID *b)
IsEqualGUID.
#define WINPR_COM_DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8)
defines a GUID constant visible in the including file only (nothing to link)
WINPR_API void winpr_com_base_init(wComBase *object, const char *className, const wIUnknownVtbl *vtbl, pfnwComBaseFree Free)
sets the vtable and the reference count to 1, the caller owns that first reference.
WINPR_API ULONG winpr_com_base_add_ref(wComBase *object)
AddRef of an object starting with a wComBase.
#define WINPR_COM_CALL
the calling convention of COM methods (STDMETHODCALLTYPE)
WINPR_API HRESULT winpr_com_base_query(wComBase *object, const IID *iid, const IID *riid, void **ppv)
QueryInterface of an object whose only interface is iid (nullptr: IUnknown only). On success *ppv is ...
WINPR_API ULONG winpr_com_base_release(wComBase *object)
Release of an object starting with a wComBase: calls its Free at 0.
the vtable of IUnknown, the first entries of every COM vtable