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

COM IUnknown接口封装(非代理)

    博客分类:
  • Com
 
阅读更多
CNonDelegatingUnknown.h
#ifndef __unknwn_h__
#include <unknwn.h>
#include <objbase.h>
#include <atlbase.h>
#endif
class INonDelegatingUnknown
{
public:
	virtual HRESULT _stdcall NonDelegatingQueryInterface(const IID& riid,void** ppvObject)=0;
	virtual ULONG _stdcall NonDelegatingAddRef()=0;
	virtual ULONG _stdcall NonDelegatingRelease()=0;
};
class CNonDelegatingUnknown:public INonDelegatingUnknown
{
public:
	CNonDelegatingUnknown(){}
	~CNonDelegatingUnknown(){}
	CNonDelegatingUnknown(IUnknown* pi)
	{
		pIUnknownOuter=pi;
	}
	virtual HRESULT _stdcall NonDelegatingQueryInterface(const IID& riid,void** ppvObject)=0;
	virtual ULONG _stdcall NonDelegatingAddRef(){return InterlockedIncrement(&m_cNon);}
	virtual ULONG _stdcall NonDelegatingRelease()
	{
		if(InterlockedDecrement(&m_cNon)==0)
		{
			delete this;
			return 0;
		}
		return m_cNon;
	}
	virtual long _stdcall getRleaseCount()
	{
		return m_cNon;
	}
	virtual IUnknown* _stdcall getUnknownOuter()
	{
		return pIUnknownOuter;
	}
protected:
	long m_cNon;
	CComPtr<IUnknown> pIUnknownOuter;
};
#define DECLARE_UNKNOWN																			\
	virtual HRESULT _stdcall QueryInterface(REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject)	\
	{																							\
		CComPtr<IUnknown> pt=getUnknownOuter();													\
		if(pt!=NULL)																			\
		{																						\
			return pt->QueryInterface(riid,ppvObject);											\
		}																						\
		return NonDelegatingQueryInterface(riid,ppvObject);										\
	}																							\
	virtual ULONG _stdcall AddRef()																\
	{																							\
		CComPtr<IUnknown> pt=getUnknownOuter();													\
		if(pt!=NULL)																			\
		{																						\
			return pt->AddRef();																\
		}																						\
		return NonDelegatingAddRef();															\
	}																							\
	virtual ULONG _stdcall Release()															\
	{																							\
		CComPtr<IUnknown> pt=getUnknownOuter();													\
		if(pt!=NULL)																			\
		{																						\
			return pt->Release();																\
		}																						\
		return NonDelegatingRelease();															\
	}																							\
// {D07A3146-CEE6-40c6-A5F5-63687189205E}
const IID IID_INONDELEGATINGUNKNOWN = 
{ 0xd07a3146, 0xcee6, 0x40c6, { 0xa5, 0xf5, 0x63, 0x68, 0x71, 0x89, 0x20, 0x5e } };

 

CNonDelegatingUnknown.cpp
#include "INonDelegatingUnknown.h"
HRESULT _stdcall CNonDelegatingUnknown::NonDelegatingQueryInterface(const IID& riid,void** ppvObject)
{
	if(riid==IID_IUnknown)
	{
		*ppvObject=(INonDelegatingUnknown*)(this);
		((IUnknown*)(*ppvObject))->AddRef();
	}
	else
	{
		*ppvObject=NULL;
		return E_NOINTERFACE;
	}
	return S_OK;
}

 

分享到:
评论

相关推荐

    com技术内幕的随书源码

    3. **IUnknown接口**:这是所有COM接口的基接口,提供三个基本方法:QueryInterface(获取其他接口)、AddRef(增加引用计数)和Release(释放引用计数),用于管理组件的生命周期和接口查询。 4. **组件注册**:...

    用VC进行COM编程所必须掌握的理论知识

    5. **IUnknown接口**:所有COM接口都继承自IUnknown,提供了对象引用计数和接口查询的基本操作。`AddRef()`和`Release()`管理对象生命周期,`QueryInterface()`用于获取对象支持的其他接口。 6. **类工厂(Class ...

    COM与COM+从入门到精通

    3. **IUnknown接口**:所有COM组件都必须实现IUnknown接口,它提供了三个基本方法:QueryInterface、AddRef和Release,用于获取接口、增加引用计数和释放组件资源。 4. **自动化和类型库**:COM支持自动化,使得非...

    COM,WebService实例入门

    3. **IUnknown接口**:每个COM对象都必须实现IUnknown接口,提供AddRef、Release和QueryInterface方法,用于对象引用计数和接口查询。 4. **导出与注册**:VC++ 6.0使用 atlcom.h 和 atlbase.h 头文件,以及...

    ComTest.rar

    COM接口是纯虚函数的C++类,通过`IUnknown`接口,客户端可以获取到组件的其他接口。 2. **实例(Instance)**:每个COM组件可以有多个实例,每个实例都有自己的状态和资源。 3. **标识(ID)**:每个COM对象都有一个...

    Visual C++实践与提高-COM和COM+篇『PDF』

    2.5.3 IUnknown接口 2.5.4 标准类厂接口:IClassFactory 2.5.5 对象代码的动态卸载 2.5.6 自动注册 2.5.7 例程实现 2.5.7.1 修改接口文件 2.5.7.2 修改对象程序 2.5.7.3 修改客户程序 2.6 为COM对象添加多接口支持 ...

    Delphi 将系统中的com接口包装为控件

    在Delphi中,通过使用TInterfacedObject类和实现IUnknown接口,我们可以轻松地创建COM对象。然而,将这些COM接口包装为控件,可以使它们在设计时更容易使用,同时提供了一种可视化的方式来与这些接口交互。 首先,...

    VC.code.(ED2000.COM).rar_mfc com

    COM的核心概念包括接口、组件、代理/ stub、线程模型和IUnknown接口。 **教程结构** 压缩包内的每个"lesson"代表一个独立的MFC COM编程教学主题,如下: 1. **Lesson 1:MFC基础** - 这个课程会引导你了解如何创建...

    COM复习题总

    4. **IUnknown接口**: - 三个核心成员函数: - `AddRef`: 增加引用计数。 - `Release`: 减少引用计数,当计数为零时释放对象。 - `QueryInterface`: 请求对象提供指定接口。 - 继承`IUnknown`后,COM对象能够...

    COM技术内幕——微软组件对象模型--随书源代码

    2.2.3 非接口通信 18 2.2.4 实现细节 18 2.3 接口理论:第二部分 20 2.3.1 接口的不变性 20 2.3.2 多态 20 2.4 接口的背后 21 2.4.1 虚拟函数表 21 2.4.2 vtbl指针及实例数据 23 2.4.3 多重实例 24 2.4.4 ...

    atl深入解析_part1

    - **基本COM接口的实现**:为了帮助开发者快速构建符合COM规范的组件,ATL内置了一些基础COM接口的实现,包括但不限于`IUnknown`、`IClassFactory`、`IDispatch`、`IPersistXxx`、`IConnectionPointContainer`和`...

    组件+COM+CORBA+EJB.docx

    COM 的一个重要接口是 `IUnknown`,它是所有其他接口的基础,提供了获取和释放组件引用的通用方法。 类之间的关系在面向对象设计中至关重要。依赖关系表示类A使用类B的功能但不包含B;继承关系则表示子类继承父类的...

Global site tag (gtag.js) - Google Analytics