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

📄 ptr.h

📁 COM技术内幕源码 ,随书原码
💻 H
字号:
//// Ptr.h//   - Smart interface pointer//#include <assert.h>//// IPtr - Smart Interface Pointer//   Use:  IPtr<IX, &IID_IX> spIX ;//   Do not use with IUnknown; IPtr<IUnknown, &IID_IUnknown>//     will not compile.  Instead, use IUnknownPtr.//template <class T, const IID* piid> class IPtr{public:	// Constructors	IPtr() 	{			m_pI = NULL ;	}	IPtr(T* lp)	{		m_pI = lp ;		if ( m_pI != NULL)		{			m_pI->AddRef() ;		}	}	IPtr(IUnknown* pI)	{		m_pI = NULL ;		if (pI != NULL)		{			pI->QueryInterface(*piid, (void **)&m_pI) ;		}	}	// Destructor	~IPtr() 	{		Release() ;	}	// Reset	void Release()	{		if (m_pI != NULL)		{			T* pOld = m_pI ;			m_pI = NULL ;			pOld->Release() ;		}	}	// Conversion	operator T*() { return m_pI ;}	// Pointer operations	T& operator*()  { assert(m_pI != NULL) ; return *m_pI ;}	T** operator&() { assert(m_pI == NULL) ; return &m_pI ;}	T* operator->() { assert(m_pI != NULL) ; return m_pI ;}	// Assignment from the same interface	T* operator=(T* pI)	{		if (m_pI != pI)		{						IUnknown* pOld = m_pI ;    // Save current value.			m_pI = pI ;                // Assign new value.			if (m_pI != NULL)			{				m_pI->AddRef() ;			}			if (pOld != NULL)			{				pOld->Release() ;       // Release the old interface.			}		}		return m_pI ;	}	// Assignment from another interface	T* operator=(IUnknown* pI)	{		IUnknown* pOld = m_pI ;       // Save current value.		m_pI == NULL ;		// Query for correct interface.		if (pI != NULL)		{			HRESULT hr = pI->QueryInterface(*piid, (void**)&m_pI) ;			assert(SUCCEEDED(hr) && (m_pI != NULL)) ;		}		if (pOld != NULL)		{			pOld->Release() ;         // Release old pointer.		}		return m_pI ;	}	// Boolean functions	BOOL operator!() { return (m_pI == NULL) ? TRUE : FALSE ;}	// Requires a compiler that supports BOOL	operator BOOL() const	{ 		return (m_pI != NULL) ? TRUE : FALSE ; 	}	// GUID	const IID& iid() { return *piid ;}private:	// Pointer variable	T* m_pI ;} ;//// IUnknownPtr is a smart interface for IUnknown.//class IUnknownPtr{public:	// Constructors	IUnknownPtr() 	{		m_pI = NULL ;	}	IUnknownPtr(IUnknown* lp)	{		m_pI = lp ;		if ( m_pI != NULL)		{			m_pI->AddRef() ;		}	}	// Destructor	~IUnknownPtr() 	{ 		Release() ; 	}	// Reset	void Release() 	{		if (m_pI)		{			IUnknown* pOld = m_pI ;			m_pI = NULL ;			pOld->Release() ;		}	}	// Conversion	operator IUnknown*() { return (IUnknown*)m_pI ;}	// Pointer operations	IUnknown& operator*()  { assert(m_pI != NULL) ; return *m_pI ;}	IUnknown** operator&() { assert(m_pI == NULL) ; return &m_pI ;}	IUnknown* operator->() { assert(m_pI != NULL) ; return m_pI ;}	// Assignment	IUnknown* operator=(IUnknown* pI)	{				if (m_pI != pI)		{			IUnknown* pOld = m_pI ;      // Save current value.			m_pI = pI ;                  // Assign new value.			if (m_pI != NULL)			{				m_pI->AddRef() ;			}			if (pOld != NULL)            // Release the old interface.			{				pOld->Release() ;			}		}		return m_pI ;	}	// Boolean functions	BOOL operator!() { return (m_pI == NULL) ? TRUE : FALSE ;}	operator BOOL() const	{ 		return (m_pI != NULL) ? TRUE : FALSE ; 	}private:	// Pointer variable	IUnknown* m_pI ;} ;

⌨️ 快捷键说明

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