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;
}
分享到:
相关推荐
3. **IUnknown接口**:这是所有COM接口的基接口,提供三个基本方法:QueryInterface(获取其他接口)、AddRef(增加引用计数)和Release(释放引用计数),用于管理组件的生命周期和接口查询。 4. **组件注册**:...
5. **IUnknown接口**:所有COM接口都继承自IUnknown,提供了对象引用计数和接口查询的基本操作。`AddRef()`和`Release()`管理对象生命周期,`QueryInterface()`用于获取对象支持的其他接口。 6. **类工厂(Class ...
3. **IUnknown接口**:所有COM组件都必须实现IUnknown接口,它提供了三个基本方法:QueryInterface、AddRef和Release,用于获取接口、增加引用计数和释放组件资源。 4. **自动化和类型库**:COM支持自动化,使得非...
3. **IUnknown接口**:每个COM对象都必须实现IUnknown接口,提供AddRef、Release和QueryInterface方法,用于对象引用计数和接口查询。 4. **导出与注册**:VC++ 6.0使用 atlcom.h 和 atlbase.h 头文件,以及...
COM接口是纯虚函数的C++类,通过`IUnknown`接口,客户端可以获取到组件的其他接口。 2. **实例(Instance)**:每个COM组件可以有多个实例,每个实例都有自己的状态和资源。 3. **标识(ID)**:每个COM对象都有一个...
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中,通过使用TInterfacedObject类和实现IUnknown接口,我们可以轻松地创建COM对象。然而,将这些COM接口包装为控件,可以使它们在设计时更容易使用,同时提供了一种可视化的方式来与这些接口交互。 首先,...
COM的核心概念包括接口、组件、代理/ stub、线程模型和IUnknown接口。 **教程结构** 压缩包内的每个"lesson"代表一个独立的MFC COM编程教学主题,如下: 1. **Lesson 1:MFC基础** - 这个课程会引导你了解如何创建...
4. **IUnknown接口**: - 三个核心成员函数: - `AddRef`: 增加引用计数。 - `Release`: 减少引用计数,当计数为零时释放对象。 - `QueryInterface`: 请求对象提供指定接口。 - 继承`IUnknown`后,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 ...
- **基本COM接口的实现**:为了帮助开发者快速构建符合COM规范的组件,ATL内置了一些基础COM接口的实现,包括但不限于`IUnknown`、`IClassFactory`、`IDispatch`、`IPersistXxx`、`IConnectionPointContainer`和`...
COM 的一个重要接口是 `IUnknown`,它是所有其他接口的基础,提供了获取和释放组件引用的通用方法。 类之间的关系在面向对象设计中至关重要。依赖关系表示类A使用类B的功能但不包含B;继承关系则表示子类继承父类的...