Sweden-Number/dlls/quartz/iunk.h

70 lines
1.5 KiB
C
Raw Normal View History

2001-08-15 21:26:52 +02:00
/*
* An implementation of IUnknown.
*
* hidenori@a2.ctktv.ne.jp
*/
#ifndef WINE_DSHOW_IUNK_H
#define WINE_DSHOW_IUNK_H
/*
To avoid implementing IUnknown for all interfaces,
1) To give a method to get rel-offset of IUnknown.
2) The IUnknown knows all IIDs and offsets of interfaces.
So each implementation must have following two members
with the following order:
typedef struct IDispatchImpl
{
ICOM_VFIELD(IDispatch); <-pointer of the interface.
size_t ofsIUnknown; <-ofs<IDispatchImpl> - ofs<QUARTZ_IUnkImpl>
};
*/
2001-08-28 19:25:39 +02:00
/* for InterlockedExchangeAdd. */
#include <pshpack4.h>
2001-08-15 21:26:52 +02:00
typedef struct QUARTZ_IFEntry
{
const IID* piid; /* interface ID. */
2001-08-15 21:26:52 +02:00
size_t ofsVTPtr; /* offset from IUnknown. */
} QUARTZ_IFEntry;
typedef struct QUARTZ_IFDelegation
{
struct QUARTZ_IFDelegation* pNext;
HRESULT (*pOnQueryInterface)(
IUnknown* punk, const IID* piid, void** ppobj );
} QUARTZ_IFDelegation;
2001-08-15 21:26:52 +02:00
typedef struct QUARTZ_IUnkImpl
{
/* pointer of IUnknown interface. */
ICOM_VFIELD(IUnknown);
/* array of supported IIDs and offsets. */
const QUARTZ_IFEntry* pEntries;
DWORD dwEntries;
/* list of delegation handlers. */
QUARTZ_IFDelegation* pDelegationFirst;
2001-08-28 19:25:39 +02:00
/* called on final release. */
void (*pOnFinalRelease)(IUnknown* punk);
2001-08-15 21:26:52 +02:00
/* IUnknown fields. */
2001-08-28 19:25:39 +02:00
LONG ref;
IUnknown* punkControl;
2001-08-15 21:26:52 +02:00
} QUARTZ_IUnkImpl;
2001-08-28 19:25:39 +02:00
#include <poppack.h>
2001-08-15 21:26:52 +02:00
void QUARTZ_IUnkInit( QUARTZ_IUnkImpl* pImpl, IUnknown* punkOuter );
void QUARTZ_IUnkAddDelegation(
QUARTZ_IUnkImpl* pImpl, QUARTZ_IFDelegation* pDelegation );
2001-08-15 21:26:52 +02:00
#endif /* WINE_DSHOW_IUNK_H */