/* * An implementation of IUnknown. * * Copyright (C) Hidenori TAKESHIMA * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #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 - ofs }; */ /* for InterlockedExchangeAdd. */ #include typedef struct QUARTZ_IFEntry { const IID* piid; /* interface ID. */ 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; 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; /* called on final release. */ void (*pOnFinalRelease)(IUnknown* punk); /* IUnknown fields. */ LONG ref; IUnknown* punkControl; } QUARTZ_IUnkImpl; #include void QUARTZ_IUnkInit( QUARTZ_IUnkImpl* pImpl, IUnknown* punkOuter ); void QUARTZ_IUnkAddDelegation( QUARTZ_IUnkImpl* pImpl, QUARTZ_IFDelegation* pDelegation ); #endif /* WINE_DSHOW_IUNK_H */