`
mengdejun
  • 浏览: 399878 次
  • 性别: 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 IUnknown接口封装

    NULL 博文链接:https://mengdejun.iteye.com/blog/932042

    com原理小例子(IUnKnown接口的实现)

    本程序主要是写一个计算器组件,其中有两个接口IBaseMath、ISuperMath,前一接口定义加减运算,后一接口定义乘除运算。本程序是自己学习com写的小程序,希望对初学COM的你有所帮助。

    delphi的com机制

    IUnknown 接口 COM 对象的接口原则 ⊙ 第三章 COM 的实现 COM 组件注册信息 注册 COM 组件 类厂和 DllGetObjectClass 函数 CoGetClassObject 函数 CoCreateInstance / CoCreateInstanceEx 函数 COM 库的初始...

    VC++ COM组件开发相关实例

    一 组件基础 1 软件开发的阶段 ... 1) 父接口是IUnknown接口 2) 在对象内添加函数,函数定义必须 是返回 HRESULT. HRESULT是32位整数,返回函数是否 执行成功,需要使用 SUCCESSED和 FAILED宏来判断返回值.

    检测COM接口信息的源码和例子

    通过简单的宏获取一个接口能提供的信息,比如能QueryInterface的接口,能通过QueryService提供的服务,容器希望接口提供的服务等。 比如,代码为: COM_VERIFY(spShellBrower.CoCreateInstance(CLSID_ShellDesktop)...

    【Win32】进程内COM的实现

    使用VC8,Win32 API,非ATL或MFC,实现进程内COM组件。压缩包内有三个工程,包括,使用嵌套类实现IUnknown接口的COM、使用多继承实现IUnknown接口的COM,实现IDispatch接口的Automation。

    面向对象方法学COM组件.pdf

    面向对象方法学COM组件笔记,需要下载,面向对象方法学COM组件笔记,需要下载,

    COM实验报告.pdf

    ] interface IMath : IUnknown //接口 IMath 派生自 IUnknown { //接口函数列表 [helpstring("method Add")] HRESULT Add([in] long n1, [in] long n2, [out,retval] long * pnVal); }; //增加接口代码 [ object, ...

    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对象添加多接口支持 ...

    COM编程入门资料COM入门资料

    • 基本接口——描述IUnknown基本接口及其方法 • 掌握串的处理——在COM代码中如何处理串 • 应用COM技术——例子代码,举例说明本文所讨论的所有概念 • 处理HRESULT——HRESULT类型描述,如何监测错误及成功...

    COM与COM+从入门到精通(pdf版本,含源码)

    实现IUnknown和自定义接口 完成COM服务器 生成测试客户机 用ATL建立COM服务器 关于ATL 用ATL建立进程内COM服务器 用ATL建立进程外COM服务器 线程与COM服务器 Win32多线程应用 线程COM组件 自动化与...

    Essntial COM.pdf

    COM本质论(简体) Essntial COM 运行时的多态,抽象基类作为二进制接口。套间,类,IUnknown接口

    Essntial COM(.pdf)

    COM本质论(简体) Essntial COM 运行时的多态,抽象基类作为二进制接口。 套间,类,IUnknown接口

    COM原理与应用

    基本接口——描述IUnknown基本接口及其方法。 掌握串的处理——在COM代码中如何处理串。 应用COM技术——例子代码,举例说明本文所讨论的所有概念。 处理HRESULT——HRESULT类型描述,如何监测错误及成功代码。

    C++ COM编程之QueryInterface函数(二)

    前言 在COM编程——认识组件中也总结了,COM是一个说明如何建立可动态互变组件的规范,它提供了为保证能够互操作,客户和组件...因为当查询组件实例的IUnknown接口时,不论通过哪个接口,所得到的均将是同一指针值。为

    C#接口实现方法实例分析

    熟悉COM的开发人员应注意,尽管在概念上C#接口类似于COM接口,但它们是不同的,底层的结构不同,例如,C#接口并不派生于IUnknown。C#接口根据.NET函数提供了一个契约。与COM接口不同,C#接口不代表任何类型的二进制...

    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服务器.doc

    • 实 现接口,从IUnknown 开始——展示如何用C++类编写一个接口实现并描述IUnknown之方法的目的 • 构 造器和析构器 • AddRef() 和 Release() • QueryInterface() • 深 入CoCreateInstance()——探究...

    精通MFC 原版书 超星

    第五部分介绍COM编程技术,重点分析了MFC对IUnknown接口、聚合、自动化、连接点的支持。在这一部分,读者在了解MFC实现COM原理的同时,还将了解到一些非常实用的编程技术,譬如动态调用、接口映射等。第六部分则介绍...

    COM 组件设计与应用(六)——用 ATL 写第一个组件VC源代码

    2、这第一个组件,除了所有 COM 组件必须的 IUnknown 接口外,我们再实现一个自己定义的接口 IFun,它有两个函数: Add()完成两个数值的加法,Cat()完成两个字符串的连接。3、下面......好好听讲! 开始了:-) 关键字...

Global site tag (gtag.js) - Google Analytics