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

COM IUnknown接口封装

    博客分类:
  • Com
 
阅读更多
CAbstractUnknown.h
#include <objbase.h>
#include <unknwn.h>
#define DECLARE_IUNKNOWN_INTERFACE														\
	public:																				\
		virtual HRESULT _stdcall QueryInterface(const IID& riid,void** ppvObject);		\
		virtual ULONG _stdcall AddRef ();												\
		virtual ULONG _stdcall Release();
class CAbstractUnknown:public IUnknown
{
public:
	CAbstractUnknown();
	virtual HRESULT _stdcall QueryInterface(const IID& riid,void** ppvObject)=0;
    virtual ULONG _stdcall AddRef ();
	virtual ULONG _stdcall Release();
	//virtual HRESULT _stdcall NonDelegatingQueryInterface(const IID& riid,void** ppvObject)=0;
	//virtual ULONG _stdcall NonDelegatingAddRef();
	//virtual ULONG _stdcall NonDelegatingRelease();
protected:
	long m_ref;
	long g_components;
};
const CLSID CLSID_CAbstractUnknown={0x38dd17, 0x6420, 0x47ca, { 0x8b, 0xca, 0xbf, 0x8b, 0x4d, 0x21, 0x32, 0x87 } };
template<class I,const GUID* pGUID>I* interface_cast(IUnknown* pIUnknown)
{
	I* pi=NULL;
	HRESULT hr=pIUnknown->QueryInterface(*pGUID,(void**)&pi);
	assert(SUCCEEDED(hr));
	return pi;
}

 

CAbstractUnknown.cpp
#include "CAbstractUnknown.h"
CAbstractUnknown::CAbstractUnknown()
{
	m_ref=0;
	g_components=0;
}
/**
HRESULT _stdcall CAbstractUnknown::QueryInterface(const IID& riid,void** ppvObject)
{
	if(p_UnknownOuter!=NULL)
	{
		return p_UnknownOuter->QueryInterface(riid,ppvObject);
	}
	else
	{
		return NonDelegatingQueryInterface(riid,ppvObject);
	}
}*/
ULONG _stdcall CAbstractUnknown::AddRef()
{
	return InterlockedIncrement(&m_ref);
}
ULONG _stdcall CAbstractUnknown::Release()
{
	if(InterlockedDecrement(&m_ref)==0)
	{
		InterlockedDecrement(&g_components);
		delete this;
		return 0;
	}
	return m_ref;
}
/**
CAbstractUnknown::CAbstractUnknown(IUnknown* m_pUnknownouter)
{
	m_ref=1;
	InterlockedIncrement(&g_components);
	p_UnknownOuter=m_pUnknownouter;
}
HRESULT _stdcall CAbstractUnknown::NonDelegatingQueryInterface(const IID& riid,void** ppvObject)
{
	if(riid==IID_IUnknown)
	{
		*ppvObject=static_cast<INonDelegatingUnknown*>(this);
		((IUnknown*)(*ppvObject))->AddRef();
	}
	return S_OK;
}
ULONG _stdcall CAbstractUnknown::NonDelegatingAddRef()
{
	return InterlockedIncrement(&m_ref);
}
ULONG _stdcall CAbstractUnknown::NonDelegatingRelease()
{
	if(InterlockedDecrement(&m_ref)==0)
	{
		InterlockedDecrement(&g_components);
		delete this;
		return 0;
	}
	return m_ref;
}*/

 

分享到:
评论

相关推荐

    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接口信息的源码和例子

    1 : IUnknown 2 : IStorage 3 : IPersist 4 : IShellIcon 5 : IShellFolder 6 : IPersistFolder 7 : IPersistFolder2 8 : IItemNameLimits 9 : IShellFolder2 10 : IOleCommandTarget 11 : ...

    【Win32】进程内COM的实现

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

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

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

    Essntial COM.pdf

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

    Essntial COM(.pdf)

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

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

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

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

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

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

    COM原理与应用

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

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

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

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

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

    精通MFC 原版书 超星

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

    深入COM服务器.doc

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

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

    1.2.2 信息封装 5 1.3 COM 6 1.3.1 COM组件是…… 7 1.3.2 COM不是…… 7 1.3.3 COM库 8 1.3.4 COM方法 8 1.3.5 COM超越了用户的需要 8 1.4 本章小结 9 第2章 接口 11 2.1 接口的作用 11 2.1.1 可复用应用...

    COM实验报告.pdf

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

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

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

Global site tag (gtag.js) - Google Analytics