| 1 | /*
|
|---|
| 2 | * An implementation of IUnknown.
|
|---|
| 3 | *
|
|---|
| 4 | * hidenori@a2.ctktv.ne.jp
|
|---|
| 5 | */
|
|---|
| 6 |
|
|---|
| 7 | #ifndef WINE_DSHOW_IUNK_H
|
|---|
| 8 | #define WINE_DSHOW_IUNK_H
|
|---|
| 9 |
|
|---|
| 10 | /*
|
|---|
| 11 | To avoid implementing IUnknown for all interfaces,
|
|---|
| 12 |
|
|---|
| 13 | 1) To give a method to get rel-offset of IUnknown.
|
|---|
| 14 | 2) The IUnknown knows all IIDs and offsets of interfaces.
|
|---|
| 15 |
|
|---|
| 16 | So each implementation must have following two members
|
|---|
| 17 | with the following order:
|
|---|
| 18 |
|
|---|
| 19 | typedef struct IDispatchImpl
|
|---|
| 20 | {
|
|---|
| 21 | ICOM_VFIELD(IDispatch); <-pointer of the interface.
|
|---|
| 22 | size_t ofsIUnknown; <-ofs<IDispatchImpl> - ofs<QUARTZ_IUnkImpl>
|
|---|
| 23 | };
|
|---|
| 24 |
|
|---|
| 25 | */
|
|---|
| 26 |
|
|---|
| 27 | /* for InterlockedExchangeAdd. */
|
|---|
| 28 | #include <pshpack4.h>
|
|---|
| 29 |
|
|---|
| 30 | typedef struct QUARTZ_IFEntry
|
|---|
| 31 | {
|
|---|
| 32 | const IID* piid; /* interface ID. */
|
|---|
| 33 | size_t ofsVTPtr; /* offset from IUnknown. */
|
|---|
| 34 | } QUARTZ_IFEntry;
|
|---|
| 35 |
|
|---|
| 36 | typedef struct QUARTZ_IFDelegation
|
|---|
| 37 | {
|
|---|
| 38 | struct QUARTZ_IFDelegation* pNext;
|
|---|
| 39 | HRESULT (*pOnQueryInterface)(
|
|---|
| 40 | IUnknown* punk, const IID* piid, void** ppobj );
|
|---|
| 41 | } QUARTZ_IFDelegation;
|
|---|
| 42 |
|
|---|
| 43 | typedef struct QUARTZ_IUnkImpl
|
|---|
| 44 | {
|
|---|
| 45 | /* pointer of IUnknown interface. */
|
|---|
| 46 | ICOM_VFIELD(IUnknown);
|
|---|
| 47 |
|
|---|
| 48 | /* array of supported IIDs and offsets. */
|
|---|
| 49 | const QUARTZ_IFEntry* pEntries;
|
|---|
| 50 | DWORD dwEntries;
|
|---|
| 51 | /* list of delegation handlers. */
|
|---|
| 52 | QUARTZ_IFDelegation* pDelegationFirst;
|
|---|
| 53 | /* called on final release. */
|
|---|
| 54 | void (*pOnFinalRelease)(IUnknown* punk);
|
|---|
| 55 |
|
|---|
| 56 | /* IUnknown fields. */
|
|---|
| 57 | LONG ref;
|
|---|
| 58 | IUnknown* punkControl;
|
|---|
| 59 | } QUARTZ_IUnkImpl;
|
|---|
| 60 |
|
|---|
| 61 | #include <poppack.h>
|
|---|
| 62 |
|
|---|
| 63 |
|
|---|
| 64 | void QUARTZ_IUnkInit( QUARTZ_IUnkImpl* pImpl, IUnknown* punkOuter );
|
|---|
| 65 | void QUARTZ_IUnkAddDelegation(
|
|---|
| 66 | QUARTZ_IUnkImpl* pImpl, QUARTZ_IFDelegation* pDelegation );
|
|---|
| 67 |
|
|---|
| 68 |
|
|---|
| 69 | #endif /* WINE_DSHOW_IUNK_H */
|
|---|