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

    `IUnknown` 是所有 COM 接口的基接口,提供了 `QueryInterface`、`AddRef` 和 `Release` 方法,分别用于获取其他接口、增加引用计数和减少引用计数。 在实际应用中,开发者通常需要实现这个接口并将其注册到 COM ...

    jiqiao.rar_visual c_接口技术

    IDispatch接口提供了动态调用方法和属性访问的能力,而IUnknown接口是所有COM接口的基础,提供了对象的引用计数和接口查询功能。 2. **接口定义语言(IDL)**:IDL是一种用于描述COM接口的规范性语言。在VC++中,...

    COM组件中实现多接口

    这些接口可以继承自IUnknown接口,以支持基本的引用计数和接口查询操作。 2. 实现接口:然后,创建一个COM类,该类实现这些接口。每个接口的方法都需要在类中给出具体实现。 3. 注册组件:通过注册表,将COM组件...

    ComHook一个高级编程代码,通过COM接口来实现对应用程序的HOOK.rar

    1. **COM基础**:理解COM组件的基本概念,包括COM接口、IUnknown接口、CLSID(Class ID)、IID(Interface ID)以及如何创建和使用COM对象。 2. **COM接口的查询**:如何使用QueryInterface方法获取目标对象的不同...

    c++ Excel 封装类

    开发者需要理解COM的基本概念,例如IUnknown、QueryInterface和AddRef等方法,以及如何使用COM接口来调用Excel对象模型。 该封装类可能包含了以下功能: 1. 文件操作:打开、创建和保存Excel文件。 2. 工作表操作:...

    atl封装ie AtlBrowser.zip

    它涉及到COM对象的创建、接口定义、IUnknown的实现、QueryInterface、AddRef和Release方法的使用,以及如何处理事件和调用远程方法。通过这个项目,开发者可以深入理解COM对象的生命周期、接口设计原则以及如何利用...

    COM技术内幕笔记

    综上所述,COM技术的核心在于组件的标准化构建、接口的灵活运用以及IUnknown接口作为基石的设计。通过理解和掌握这些基础知识,开发者能够有效地构建和集成组件,提高软件系统的模块化程度和重用性。此外,深入探索...

    C++中COM对象INTERFACE接口和接口基类三者的构建模型[归类].pdf

    首先,`ShareObject&lt;&gt;`是一个模板类,它的主要目的是为了封装一个基于`IUnknown`接口的对象。`IUnknown`是所有COM接口的基础,提供了`AddRef()`、`Release()`和`QueryInterface()`三个方法,分别用于增加引用计数、...

    COM培训与COM教程(PPT)

    SDK中的CoCreateInstance函数用于实例化一个COM对象,IUnknown接口是所有COM接口的基类,提供了AddRef、Release和QueryInterface三个基本方法,用于对象引用计数管理和接口查询。 MFC(Microsoft Foundation ...

    C++使用ADO封装连接SQLServer类

    在C++中,我们需要实例化一个CComPtr&lt;IUnknown&gt;类型的指针,并用它来初始化一个ADODB::Connection对象。设置适当的连接字符串,例如:"Provider=SQLOLEDB;Data Source=&lt;服务器名&gt;;Initial Catalog=&lt;数据库名&gt;;User ...

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

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

    《COM实用入门视频教程》PPT及配套源代码

    1. **COM基础**:解释COM的基本原理,包括组件、接口、IUnknown接口、QueryInterface方法、AddRef和Release方法等。这些概念是理解COM的关键。 2. **组件注册与激活**:讲解如何注册COM组件到系统注册表,以及如何...

    COM编程技术基础.pdf

    实现COM组件,开发者需要遵守一系列规则,如正确实现IUnknown接口,管理对象的生命周期,以及正确处理接口引用计数。此外,COM组件通过接口暴露功能,每个接口都定义了一组相关的方法,这些方法的实现保证了组件的...

    Delphi中的DLL封装和调用对象技术

    同时,由于DLL和调用程序可能不在同一个进程空间,所以通常会使用接口(如IUnknown、IDispatch等)进行通信,以支持跨进程调用。 下面是一个简单的调用DLL中对象的示例: ```delphi uses ComObj; var ...

    第二课 ArcGIS Engine应用开发基础.pdf

    在COM模型中,类实现接口,所有COM类都必须实现IUnknown接口,这是COM类的基本要求。Coclasses(可创建的类)允许开发者通过New关键字创建实例,这在VBA或VB.NET等环境中特别有用。COM接口定义了一组逻辑上相关的...

    32位汇编中定义Unicode字符串、使用SSE4指令、使用COM接口的宏

    在32位汇编编程中,处理Unicode字符串、利用高级SIMD扩展(SSE4)指令以及使用组件对象模型(COM)接口是提高程序效率和跨平台兼容性的重要技术。以下将详细介绍这些知识点: 首先,关于**Unicode字符串**,Unicode...

    COM本质论 c++

    在C++中实现COM,通常需要实现IUnknown接口,这是所有COM接口的基接口,包含了三个基本方法:QueryInterface、AddRef和Release。QueryInterface用于获取组件支持的其他接口,AddRef和Release则用于管理接口引用计数...

    一个用mfc实现的时钟COM元件

    5. **IUnknown接口**:这是所有COM对象必须实现的接口,包含了AddRef、Release和QueryInterface三个方法,用于对象的引用计数和接口查询。 6. **时钟COM元件的实现**:在这个项目中,开发者可能创建了一个自定义的...

    com本质论(com经典)

    通过IUnknown接口,客户端可以查询组件支持的其他接口,IUnknown包含了三个基本方法:QueryInterface(获取接口)、AddRef(增加引用计数)和Release(释放引用计数),这些方法确保了组件生命周期的正确管理。...

Global site tag (gtag.js) - Google Analytics