mirror of
https://github.com/reactos/reactos.git
synced 2024-08-28 22:28:36 +00:00
51 lines
2.2 KiB
C
51 lines
2.2 KiB
C
#pragma once
|
|
|
|
/*
|
|
******************************************************************************
|
|
* This header is for easier generation of IUnknown interfaces for inherited *
|
|
* classes and for casts from the interface to the implementation and vice *
|
|
* versa. *
|
|
******************************************************************************
|
|
*/
|
|
|
|
/* Generates a Iiface::AddRef() method that forwards to Iimpl::AddRef() */
|
|
#define METHOD_IUNKNOWN_INHERITED_ADDREF_NAME(iface,impl) impl##Impl_##iface##_AddRef
|
|
#define METHOD_IUNKNOWN_INHERITED_ADDREF(iface,impl) \
|
|
static ULONG STDMETHODCALLTYPE \
|
|
impl##Impl_##iface##_AddRef(IN OUT iface *ifc) { \
|
|
impl##Impl *This = impl##Impl_from_##iface (ifc); \
|
|
impl *baseiface = impl##_from_##impl##Impl(This); \
|
|
return impl##Impl_AddRef(baseiface); \
|
|
}
|
|
|
|
/* Generates a Iiface::Release() method that forwards to Iimpl::Release() */
|
|
#define METHOD_IUNKNOWN_INHERITED_RELEASE_NAME(iface,impl) impl##Impl_##iface##_Release
|
|
#define METHOD_IUNKNOWN_INHERITED_RELEASE(iface,impl) \
|
|
static ULONG STDMETHODCALLTYPE \
|
|
impl##Impl_##iface##_Release(IN OUT iface *ifc) { \
|
|
impl##Impl *This = impl##Impl_from_##iface (ifc); \
|
|
impl *baseiface = impl##_from_##impl##Impl(This); \
|
|
return impl##Impl_AddRef(baseiface); \
|
|
}
|
|
|
|
/* Generates a Iiface::QueryInterface() method that forwards to Iimpl::QueryInterface() */
|
|
#define METHOD_IUNKNOWN_INHERITED_QUERYINTERFACE_NAME(iface,impl) impl##Impl_##iface##_QueryInterface
|
|
#define METHOD_IUNKNOWN_INHERITED_QUERYINTERFACE(iface,impl) \
|
|
static HRESULT STDMETHODCALLTYPE \
|
|
impl##Impl_##iface##_QueryInterface(IN OUT iface *ifc, IN REFIID riid, OUT VOID **ppvObject) { \
|
|
impl##Impl *This = impl##Impl_from_##iface (ifc); \
|
|
impl *baseiface = impl##_from_##impl##Impl(This); \
|
|
return impl##Impl_QueryInterface(baseiface, riid, ppvObject); \
|
|
}
|
|
|
|
/* Generates a Ixxx_from_IxxxImpl() and a IxxxImpl_from_Ixxx() inline function */
|
|
#define IMPL_CASTS(iface,impl,vtbl) \
|
|
static __inline iface * \
|
|
iface##_from_##impl##Impl (impl##Impl *This) { \
|
|
return (iface *)&This->vtbl; \
|
|
} \
|
|
static __inline impl##Impl * \
|
|
impl##Impl_from_##iface (iface *ifc) { \
|
|
return (impl##Impl *)((ULONG_PTR)ifc - FIELD_OFFSET(impl##Impl, vtbl)); \
|
|
}
|