⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unkimp.h

📁 linux下的一款播放器
💻 H
📖 第 1 页 / 共 2 页
字号:
#else    // These can be overriden in the derived object to provide    // an object specific imp.    STDMETHOD_(ULONG32,ActualAddRef) (THIS)    {#ifdef ENABLE_UNKIMP_TRACKER	ULONG32 postAddRefRefCount = InterlockedIncrement(&m_lCount);	if (ms_pIUnknownTracker)	{	    ms_pIUnknownTracker->OnIUnknownAddRef( this, postAddRefRefCount );	}	return postAddRefRefCount;#else	return InterlockedIncrement(&m_lCount);#endif    }    STDMETHOD_(ULONG32,ActualRelease) (THIS)    {	HX_ASSERT(m_lCount>0);#ifdef ENABLE_UNKIMP_TRACKER	ULONG32 preReleaseRefCount = m_lCount;	if (ms_pIUnknownTracker)	{	    ms_pIUnknownTracker->OnIUnknownRelease( this, preReleaseRefCount );	}#endif	if (InterlockedDecrement(&m_lCount) > 0)	{	    return m_lCount;	}	FinalRelease();	delete this;	return 0;    }    STDMETHOD(FinalConstruct)()    {	return HXR_OK;    }    virtual void FinalRelease()    {    }#endif    LONG32 m_lCount;    IUnknown* m_punkOuter;    IUnknown* m_punkControlling;    friend class CAggregateImpl;private:    CUnknownIMP(CUnknownIMP&) : IUnknown () {}    #ifdef ENABLE_UNKIMP_TRACKER    static IHXIUnknownTracker* ms_pIUnknownTracker;#endif};#ifdef INCLUDE_DEBUG_LIFETIME#define INIT_DEBUG_LIFETIME(CLASS)			\CUnknownIMP::InitFilename(#CLASS);#else#define INIT_DEBUG_LIFETIME(CLASS)#endif#ifdef ENABLE_UNKIMP_TRACKER#define INIT_UNKIMP_TRACKER \IHXIUnknownTracker* CUnknownIMP::ms_pIUnknownTracker = NULL;#endifclass CAggregateImpl : public IUnknown{public:    CAggregateImpl( CUnknownIMP* pobjAggregated )	: m_lCount( 0 )	, m_pobjAggregated( pobjAggregated )    {}    virtual ~CAggregateImpl()    {	delete m_pobjAggregated;    }    /*     *	IUnknown methods     */    STDMETHOD(QueryInterface)    (	THIS_	REFIID riid,	void** ppvObj    )    {	return m_pobjAggregated->_ActualQI(riid, ppvObj);    }    STDMETHOD_(ULONG32,AddRef) (THIS)    {#ifdef ENABLE_UNKIMP_TRACKER	ULONG32 postAddRefRefCount = InterlockedIncrement(&m_lCount);	if (CUnknownIMP::ms_pIUnknownTracker)	{	    CUnknownIMP::ms_pIUnknownTracker->OnIUnknownAddRef( m_pobjAggregated, postAddRefRefCount );	}	return postAddRefRefCount;#else	return InterlockedIncrement(&m_lCount);#endif    }    STDMETHOD_(ULONG32,Release) (THIS)    {	HX_ASSERT(m_lCount>0);#ifdef ENABLE_UNKIMP_TRACKER	ULONG32 preReleaseRefCount = m_lCount;	if (CUnknownIMP::ms_pIUnknownTracker)	{	    CUnknownIMP::ms_pIUnknownTracker->OnIUnknownRelease( m_pobjAggregated, preReleaseRefCount );	}#endif	if (InterlockedDecrement(&m_lCount) > 0)	{	    return m_lCount;	}	delete this;	return 0;    }private:    LONG32 m_lCount;    CUnknownIMP* m_pobjAggregated;    CAggregateImpl(){}    CAggregateImpl(CAggregateImpl&) : IUnknown () {}};inline STDMETHODIMPCUnknownIMP::SetupAggregation( IUnknown* pvOuterObj, IUnknown** pvResult ){    if( !pvResult )	return HXR_POINTER;    // Initial result code, initialize out parameter    HX_RESULT result = HXR_FAIL;    *pvResult = NULL;    // This can only happen before any calls to AddRef()    HX_ASSERT( 0 == m_lCount );    if( !m_lCount )    {	if(pvOuterObj)	{	    m_punkOuter = pvOuterObj;	    m_punkControlling = new CAggregateImpl( this );	    m_punkControlling->AddRef();	    result = HXR_OK;	}	else	{	    result = QueryInterface( IID_IUnknown, (void**) &m_punkControlling );	    HX_ASSERT( SUCCEEDED( result ) );	}    }    if( SUCCEEDED( result ) )	*pvResult = m_punkControlling;    return result;}#define DECLARE_UNKNOWN(THIS_CLASS)				\	DECLARE_COM_CREATE_FUNCS(THIS_CLASS)			\    public:							\	STDMETHOD(QueryInterface)				\	(							\	    THIS_						\	    REFIID riid,					\	    void** ppvObj					\	);							\	STDMETHOD_(ULONG32, AddRef)(THIS);			\	STDMETHOD_(ULONG32, Release)(THIS);			\    protected:							\	STDMETHOD(_ActualQI)(REFIID riid, void** ppvObj);\    public:	#define DECLARE_UNKNOWN_NOCREATE(THIS_CLASS)				\    public:							\	STDMETHOD(QueryInterface)				\	(							\	    THIS_						\	    REFIID riid,					\	    void** ppvObj					\	);							\	STDMETHOD_(ULONG32, AddRef)(THIS);			\	STDMETHOD_(ULONG32, Release)(THIS);			\    protected:							\	STDMETHOD(_ActualQI)(REFIID riid, void** ppvObj);\    public:#define BEGIN_INTERFACE_LIST(THIS_CLASS)				\	IMPLEMENT_COM_CREATE_FUNCS(THIS_CLASS)				\	STDMETHODIMP THIS_CLASS::QueryInterface				\	(								\	    THIS_							\	    REFIID riid,						\	    void** ppvObj						\	)								\	{return CUnknownIMP::QueryInterface(riid, ppvObj);}		\	STDMETHODIMP_(ULONG32) THIS_CLASS::AddRef(THIS)			\	{return CUnknownIMP::AddRef();}					\	STDMETHODIMP_(ULONG32) THIS_CLASS::Release(THIS)		\	{return CUnknownIMP::Release();}				\	STDMETHODIMP THIS_CLASS::_ActualQI(REFIID riid, void** ppvObj)	\	{								\	    if (!ppvObj)						\		return HXR_POINTER;					\	    if (IsEqualIID(IID_IUnknown, riid))				\	    {								\		AddRef();						\		*ppvObj = CUnknownIMP::GetUnknown();			\		return HXR_OK;						\	    }#define BEGIN_INTERFACE_LIST_NOCREATE(THIS_CLASS)				\	STDMETHODIMP THIS_CLASS::QueryInterface				\	(								\	    THIS_							\	    REFIID riid,						\	    void** ppvObj						\	)								\	{return CUnknownIMP::QueryInterface(riid, ppvObj);}		\	STDMETHODIMP_(ULONG32) THIS_CLASS::AddRef(THIS)			\	{return CUnknownIMP::AddRef();}					\	STDMETHODIMP_(ULONG32) THIS_CLASS::Release(THIS)		\	{return CUnknownIMP::Release();}				\	STDMETHODIMP THIS_CLASS::_ActualQI(REFIID riid, void** ppvObj)	\	{								\	    if (!ppvObj)						\		return HXR_POINTER;					\	    if (IsEqualIID(IID_IUnknown, riid))				\	    {								\		AddRef();						\		*ppvObj = CUnknownIMP::GetUnknown();			\		return HXR_OK;						\	    }#define INTERFACE_LIST_ENTRY(INTERFACE_IID, INTERFACE_CLASS)	\	    if (IsEqualIID(INTERFACE_IID, riid))		\	    {							\		AddRef();					\		INTERFACE_CLASS* pThisAsInterfaceClass = this;  \		*ppvObj = pThisAsInterfaceClass;		\		return HXR_OK;					\	    }/*!    @defined INTERFACE_LIST_ENTRY_BASE    @discussion Specifies a base class whose query interface function should be called.*/#define INTERFACE_LIST_ENTRY_BASE( BASE_CLASS )				\	if( SUCCEEDED( BASE_CLASS::_ActualQI( riid, ppvObj ) ) )	\	{								\	    return HXR_OK;						\	}#define INTERFACE_LIST_ENTRY2(DERIVED_CLASS, BASE_INTERFACE_IID, BASE_CLASS)	\	    if (IsEqualIID(BASE_INTERFACE_IID, riid))		\	    {							\		AddRef();					\		DERIVED_CLASS* pTemp1 = this;			\		BASE_CLASS* pTemp2 = pTemp1;			\		*ppvObj = pTemp2;				\		return HXR_OK;					\	    }#define INTERFACE_LIST_ENTRY_DELEGATE_BLIND(DELEGATE_QI_FUNCTION)\	    if( SUCCEEDED( DELEGATE_QI_FUNCTION( riid, ppvObj ) ) )\	    {							\		return HXR_OK;					\	    }							\#define INTERFACE_LIST_ENTRY_DELEGATE(INTERFACE_IID, DELEGATE_QI_FUNCTION)\	    if(IsEqualIID(INTERFACE_IID, riid) &&		\		SUCCEEDED( DELEGATE_QI_FUNCTION( riid, ppvObj ) ) )\	    {							\		return HXR_OK;					\	    }#define END_INTERFACE_LIST					\	    *ppvObj = NULL;					\	    return HXR_NOINTERFACE;				\	}/*!    @defined END_INTERFACE_LIST_BASE    @discussion Ends the list of supported interfaces.  Specifies the base class whose    query interface function should be called.*/#define END_INTERFACE_LIST_BASE( BASE_CLASS )									\	return BASE_CLASS::_ActualQI( riid, ppvObj );							\    }                                                       							#define DECLARE_COM_CREATE_FUNCS(CLASS)				\    public:							\	static CLASS* CreateObject();				\	static HX_RESULT CreateObject(CLASS** ppObj);		\	static HX_RESULT CreateInstance(IUnknown** ppvObj);	\	static HX_RESULT CreateInstance				\	(							\	    IUnknown* pvOuter,					\	    IUnknown** ppvObj					\	);							\#define IMPLEMENT_COM_CREATE_FUNCS(CLASS)			\    HX_RESULT CLASS::CreateObject(CLASS** ppObj)		\    {								\	*ppObj = new CLASS;					\	if (*ppObj)						\	{							\	    InterlockedIncrement(&((*ppObj)->m_lCount));	\	    HX_RESULT pnrRes = (*ppObj)->FinalConstruct();	\	    InterlockedDecrement(&((*ppObj)->m_lCount));	\	    if (FAILED(pnrRes))					\	    {							\		delete (*ppObj);				\		(*ppObj) = NULL;				\		return pnrRes;					\	    }							\	    return HXR_OK;					\	}							\	return HXR_OUTOFMEMORY;		   			\    }								\    CLASS* CLASS::CreateObject()				\    {								\	CLASS* pNew = NULL;					\	if (SUCCEEDED(CreateObject(&pNew)))			\	{							\	    return pNew;					\	}							\	return NULL;						\    }								\    HX_RESULT CLASS::CreateInstance				\    (								\	IUnknown* pvOuterObj,					\	IUnknown** ppvObj					\    )								\    {								\	if (!ppvObj)						\	    return HXR_POINTER;					\	*ppvObj = NULL;						\	CLASS* pNew = NULL;					\	HX_RESULT pnrRes = CreateObject(&pNew);			\	if (SUCCEEDED(pnrRes) && pNew)				\	{							\	    pnrRes = pNew->SetupAggregation( pvOuterObj, ppvObj );	\	}							\	return pnrRes;						\    }								\    HX_RESULT CLASS::CreateInstance(IUnknown** ppvObj)		\    {								\	return CreateInstance(NULL, ppvObj);			\    }								        /*!    @defined IMPLEMENT_UNKNOWN_NOINTERFACE    @discussion This fills in implementations for AddRef() and Release()--basically forwards    calls onto CUnknownIMP.*/#define IMPLEMENT_UNKNOWN_NOINTERFACE( THIS_CLASS )										\    STDMETHODIMP THIS_CLASS::QueryInterface( REFIID riid, void** ppvObj)                              \    {                                                                                                           \	return CUnknownIMP::QueryInterface( riid, ppvObj );                                                      \    }														\    STDMETHODIMP_(ULONG32) THIS_CLASS::AddRef(THIS) { return CUnknownIMP::AddRef(); }				\    STDMETHODIMP_(ULONG32) THIS_CLASS::Release(THIS) { return CUnknownIMP::Release(); }      		        /*!    @defined INTERFACE_LIST_ENTRY_SIMPLE    @discussion Simplified version of INTERFACE_LIST_ENTRY.  Only takes the interface    name.  The IID is assumed to be the interface name with 'IID_' prepended.*/#define INTERFACE_LIST_ENTRY_SIMPLE( INTERFACE_CLASS )							\	INTERFACE_LIST_ENTRY( IID_##INTERFACE_CLASS, INTERFACE_CLASS )                                        /*!    @defined INTERFACE_LIST_ENTRY_SIMPLE2    @discussion This allows an interface to appear in an interface list       even when the conversion to it is ambiguous owing to multiple       inheritence. By specifying an intermediate interface the conversion       is disambiguated.      This is the simplified version of INTERFACE_LIST_ENTRY2. Only takes       the interface names.  The IID are assumed to be the interface names       with 'IID_' prepended.*/#define INTERFACE_LIST_ENTRY_SIMPLE2( DERIVED_CLASS, BASE_CLASS )				\	INTERFACE_LIST_ENTRY2( DERIVED_CLASS, IID_##BASE_CLASS, BASE_CLASS )                                        /*!    @defined INTERFACE_LIST_ENTRY_TESTPOINTER*/#define INTERFACE_LIST_ENTRY_MEMBER( INTERFACE_IID, MEMBER_VARIABLE )					\	if( NULL != ( MEMBER_VARIABLE ) )								\	{                                                                                               \	    if( IsEqualIID( INTERFACE_IID, riid ) )                                                     \	    {                                                                                           \		if( SUCCEEDED( MEMBER_VARIABLE->QueryInterface( riid, ppvObj ) ) )                      \		    return HXR_OK;                                                                      \	    }                                                                                           \	}                                                                                               \/*!    @defined INTERFACE_LIST_ENTRY_TESTPOINTER*/#define INTERFACE_LIST_ENTRY_MEMBER_BLIND( MEMBER_VARIABLE )						\	if( NULL != ( MEMBER_VARIABLE ) )								\	{                                                                                               \	    if( SUCCEEDED( MEMBER_VARIABLE->QueryInterface( riid, ppvObj ) ) )                      	\		return HXR_OK;                                                                      	\	}                                                                                               \#endif //!__CUnknownIMP_H__

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -