`
mengdejun
  • 浏览: 408866 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

COM 智能指针CComPtr

    博客分类:
  • Com
 
阅读更多
template <class T>
class CComPtr
{
public:
	typedef T _PtrClass;
	CComPtr()
	{
		p=NULL;
	}
	CComPtr(T* lp)
	{
		if ((p = lp) != NULL)
			p->AddRef();
	}
	CComPtr(const CComPtr<T>& lp)
	{
		if ((p = lp.p) != NULL)
			p->AddRef();
	}
	~CComPtr()
	{
		if (p)
			p->Release();
	}
	void Release()
	{
		IUnknown* pTemp = p;
		if (pTemp)
		{
			p = NULL;
			pTemp->Release();
		}
	}
	operator T*() const
	{
		return (T*)p;
	}
	T& operator*() const
	{
		ATLASSERT(p!=NULL);
		return *p;
	}
	//The assert on operator& usually indicates a bug.  If this is really
	//what is needed, however, take the address of the p member explicitly.
	T** operator&()
	{
		ATLASSERT(p==NULL);
		return &p;
	}
	_NoAddRefReleaseOnCComPtr<T>* operator->() const
	{
		ATLASSERT(p!=NULL);
		return (_NoAddRefReleaseOnCComPtr<T>*)p;
	}
	T* operator=(T* lp)
	{
		return (T*)AtlComPtrAssign((IUnknown**)&p, lp);
	}
	T* operator=(const CComPtr<T>& lp)
	{
		return (T*)AtlComPtrAssign((IUnknown**)&p, lp.p);
	}
	bool operator!() const
	{
		return (p == NULL);
	}
	bool operator<(T* pT) const
	{
		return p < pT;
	}
	bool operator==(T* pT) const
	{
		return p == pT;
	}
	// Compare two objects for equivalence
	bool IsEqualObject(IUnknown* pOther)
	{
		if (p == NULL && pOther == NULL)
			return true; // They are both NULL objects

		if (p == NULL || pOther == NULL)
			return false; // One is NULL the other is not

		CComPtr<IUnknown> punk1;
		CComPtr<IUnknown> punk2;
		p->QueryInterface(IID_IUnknown, (void**)&punk1);
		pOther->QueryInterface(IID_IUnknown, (void**)&punk2);
		return punk1 == punk2;
	}
	void Attach(T* p2)
	{
		if (p)
			p->Release();
		p = p2;
	}
	T* Detach()
	{
		T* pt = p;
		p = NULL;
		return pt;
	}
	HRESULT CopyTo(T** ppT)
	{
		ATLASSERT(ppT != NULL);
		if (ppT == NULL)
			return E_POINTER;
		*ppT = p;
		if (p)
			p->AddRef();
		return S_OK;
	}
	HRESULT SetSite(IUnknown* punkParent)
	{
		return AtlSetChildSite(p, punkParent);
	}
	HRESULT Advise(IUnknown* pUnk, const IID& iid, LPDWORD pdw)
	{
		return AtlAdvise(p, pUnk, iid, pdw);
	}
	HRESULT CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL)
	{
		ATLASSERT(p == NULL);
		return ::CoCreateInstance(rclsid, pUnkOuter, dwClsContext, __uuidof(T), (void**)&p);
	}
	HRESULT CoCreateInstance(LPCOLESTR szProgID, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL)
	{
		CLSID clsid;
		HRESULT hr = CLSIDFromProgID(szProgID, &clsid);
		ATLASSERT(p == NULL);
		if (SUCCEEDED(hr))
			hr = ::CoCreateInstance(clsid, pUnkOuter, dwClsContext, __uuidof(T), (void**)&p);
		return hr;
	}
	template <class Q>
	HRESULT QueryInterface(Q** pp) const
	{
		ATLASSERT(pp != NULL && *pp == NULL);
		return p->QueryInterface(__uuidof(Q), (void**)pp);
	}
	T* p;
};

 

分享到:
评论

相关推荐

    智能指针CComPtr_和_CComQIPtr

    ### 智能指针CComPtr_和_CComQIPtr详解 #### 一、引言 在软件开发中,尤其是使用COM组件时,内存管理一直是开发者关注的重点。为了解决传统裸指针带来的资源泄露问题,ATL库提供了一组智能指针——`CComPtr&lt;&gt;`和`...

    ATL智能指针类CComPtr与CComQIPtr解析.pdf

    在ATL中,CComPtr和CComQIPtr是两种智能指针类,它们为开发者提供了一种更安全、更方便的方式来管理COM接口指针。 **CComPtr**是ATL中最基本的智能指针类,用于封装和管理单一的COM接口。它自动处理`AddRef`和`...

    ATL智能指针类CComPtr与CComQIPtr解析

    **CComPtr** 是一个通用的智能指针类,用于管理COM接口指针。它通过在对象的生命周期内自动调用`AddRef`和`Release`方法来确保资源的有效管理。以下是`CComPtr`的一些关键特性: 1. **资源释放**:当`CComPtr`实例...

    智能指针最全资料-5篇经典讲义

    MFC提供了`CComPtr`和`CComQIPtr`两种COM(Component Object Model)智能指针,专门用于处理COM接口。`CComPtr`和`CComQIPtr`能够自动调用`IUnknown`接口的`AddRef`和`Release`方法,以管理COM对象的引用计数。 ...

    COM技术内幕第9章代码客户端智能指针(VS2008通过)

    在COM编程中,智能指针是一种封装了IUnknown接口的类,如Microsoft的 `_com_ptr_t` 或 ATL(Active Template Library)的 `CComPtr` 和 `CComQIPtr`。这些智能指针类实现了引用计数机制,自动调用 `AddRef` 和 `...

    使用智能指针和晚绑定创建COM对象

    5. **使用智能指针管理对象**:创建COM对象后,我们将结果赋值给智能指针,例如`CComPtr`,以自动管理对象的生命周期。 6. **调用接口方法**:最后,我们通过智能指针调用COM对象的接口方法,执行实际的工作。 在...

    MFC音乐播放器含代码

    MFC提供了智能指针(CComPtr等)来帮助管理COM对象,确保资源的正确释放。 9. **错误处理**:良好的错误处理机制是任何软件不可或缺的部分。MFC提供了异常处理框架,允许开发者捕获和处理运行时错误。 10. **扩展...

    IDisPatch接口调用分析

    2. **智能指针的引用计数**:当使用如`CComPtr`这样的智能指针类时,获取接口指针后,智能指针会自动调用`AddRef`增加引用计数。在不再使用时,智能指针会在析构时调用`Release`。但如果直接操作接口指针(如`I** *...

    com_ptr_t 的解析

    `_com_ptr_t`与`CComPtr`和`CComQIPtr`是相似但不完全相同的智能指针类。`CComPtr`和`CComQIPtr`是ATL(Active Template Library)提供的,它们在异常安全性和移植性方面可能有所区别。`_com_ptr_t`提供了对非ATL...

    SolidWorks二次开发语法技巧及基础

    `CComPtr` 是ATL提供的智能指针类,用于管理COM对象的生命周期。它通过自动调用`AddRef`和`Release`方法来确保对象的引用计数正确更新。 #### CComPtr 的使用特点 - 自动调用`AddRef`和`Release`,简化内存管理。 ...

    基于MFC通过AOD连接数据库的C++类

    // ADO Connection对象的智能指针 spConnection.CoCreateInstance(CLSID_OLEDB_CONNECTION); // 创建实例 // 设置连接字符串 spConnection-&gt;PutConnectionString(szConnectString); // 打开数据库连接 ...

    潘爱民 COM 讲座

    4. **COM接口指针**:阐述COM接口指针的使用规则,如AddRef、Release方法的作用,理解智能指针(如CComPtr)在管理接口指针时的重要性。 5. **COM类工厂**:介绍类工厂(Class Factory)的角色,它负责创建和实例化...

    .com技术应用

    CComPtr和CComQIPtr是智能指针类,它们自动处理对象的引用计数,提供类似C++指针的使用体验,减少了内存管理和错误的可能性。 以下是一些使用ATL智能指针的例子: ```cpp // 使用CComPtr CComPtr&lt;ISum&gt; myISumPtr;...

    ATL.rar_ATL

    3. **CComPtr**: ATL的智能指针类,如CComPtr,用于安全地管理COM接口的引用计数。它们自动调用IUnknown的AddRef和Release方法,避免了内存泄漏的问题。CComPtr的使用大大简化了接口的生命周期管理。 ATL还提供了...

    MFC调用COM组件的dll源码

    MFC提供了CComPtr类模板,它是智能指针,用于安全地管理COM接口。使用CComPtr,你可以方便地实例化、引用计数和释放COM对象。 1. **创建COM对象**:首先,你需要包含对应的头文件,并使用`CoCreateInstance`函数...

    c++builder 2010 atl库 头文件和lib

    3. 客户端COM对象的使用:`CComPtr`和其他智能指针类使得COM对象的管理变得简单,避免了手动管理COM对象的引用计数带来的问题。 4. 接口继承和实现:ATL的模板类可以方便地处理接口的继承和实现,使得代码更清晰,...

    atl开发技术深入解析_part2

    CComPtr和CComQIPtr作为智能指针类,显著改进了接口指针的使用方式。它们不仅提供了一致的接口引用计数,还在对象离开作用域时自动调用Release方法,即使在异常情况下也确保了资源的正确释放。这种自动化的资源管理...

    MFC_Com_Client.rar_MFC_evc client_evc com _mfc com_wince com

    它包含了一系列的类,如CComPtr智能指针类,用于安全地管理COM对象的引用计数。 2. **创建和初始化COM对象**:在MFC中,可以通过CoCreateInstance函数来实例化一个COM对象,并使用CComPtr或其他相关的MFC类来管理这...

    COM原理与应用源码

    4. 智能指针的使用:如CComPtr、CComQIPtr等,它们自动管理COM接口的引用计数,防止内存泄漏。 5. 隔离和延迟加载:源码可能涉及DLL隔离技术,以及如何在运行时动态加载和卸载COM组件。 通过学习这些源码,开发者...

    ATL开发指南和源码

    3. CComPtr:这是一个智能指针模板,用于安全地管理COM接口指针,自动处理引用计数。 四、ATL的宏 ATL提供了一系列的宏,帮助开发者声明和实现COM接口,如DECLARE_UUID、DECLARE_PROTECT_FINAL_CONSTRUCT、DECLARE_...

Global site tag (gtag.js) - Google Analytics