com关于IUnknown接口

com定义的每个接口都必须从IUnknown继承过来,主要原因是IUnknown接口提供了两个很重要的特性:生存期控制和接口查询。

客户程序仅仅能通过接口与com对象进行通信。尽管客户程序能够无论对象内部的实现细节。但它要控制对象的存在与否。

假设客户还要继续对对象进行操作。则它必须保证对象能一直存在于内存中;假设客户对对象的操作已经完毕。以后也不再须要该对象了,则它必须及时地把对象释放掉。以提高资源的利用率。IUnknown引入了“引用计数”方法,能够有效得控制对象的生存周期。

还有一方面。假设一个com对象实现了多个接口。在初始时刻。客户程序不太可能得到该对象全部的接口指针,它仅仅会拥有一个接口指针。假设客户程序须要其它的指针。那么它怎样通过这个接口指针获得还有一个接口指针呢?IUnknown使用了接口查询(”QueryInterface“)的方法来完毕接口之间的条状。

以下是IUnknown的定义:

class IUnknown
{
	public:
		virtual HRESULT _stdcall QueryInterface(const IID& iid,void** ppv) = 0;
		virtual ULONG _stdcall AddRef() = 0;
		vittual ULONG _stdcall Release() = 0;
};
当中,QueryInterface用于查询com对象的其它接口,AddRef和Release用于对引用计数进行操作。
时间: 2024-12-28 17:20:18

com关于IUnknown接口的相关文章

COM 组件接口的 IUnKnown 接口介绍

IUnKnown是一个接口. 所有COM接口都继承IUnKnown.IUnKnown的定义在WIN32 SDK中的UNKNWN头文件中.其定义如下: interface IUnKnown { virtual HRESULT __stdcall QueryInterface(const IID& iid,void **ppv)=0; virtual ULONG __stdcall AddRef()=0; virtual ULONG __stdcall Release()=0; } IUnKnown

COM三大接口:IUnknown、IClassFactory、IDispatch

COM组件有三个最基本的接口类,分别是IUnknown.IClassFactory.IDispatch. COM规范规定任何组件.任何接口都必须从IUnknown继承,IUnknown包含三个函数,分别是 QueryInterface.AddRef.Release.这三个函数是无比重要的,而且它们的排列顺序也是不可改变的.QueryInterface用于查询组件实现的其它接口,说白了也就是看看这个组件的父类中还有哪些接口类,AddRef用于增加引用计数,Release用于减少引用计数.引用计数也

【转载】COM 组件设计与应用(八)——实现多接口

原文:http://vckbase.com/index.php/wv/1219.html 一.前言 从第五回开始到第七回,咱们用 ATL 写了一个简单的 COM 组件,之所以说简单,是因为在组件中,只实现了一个自定义(custom)的接口 IFun.当然如果想偷懒的话,我们可以把 200 个函数都加到这一个接口中, 果真如此的话,恐怕就没有人喜欢使用我们这个组件了.一个组件既然可以提供多个接口,那么我们在设计的时候,就应该按照函数的功能进行分类,把不同功能分类的函数用多个接口表现出来.这样可以有

COM接口函数通用Hook方法

本文是我的本科学位论文, 今发表在此, 以示原创之据 第1章 绪论 研究背景 研究意义 相关技术简介 COM概述 COM内存模型描述及C语言和C++语言实现 调用约定 Hook API原理 Windows钩子原理及进程注入 开发及调试环境 第2章 问题抽象及关键技术研究 实验01:通过调试器查看C++类的虚函数表 实验02:通过函数指针调用C++虚函数 实验03:交换两个相同C++类的虚函数表 实验04-1:替换C++虚函数表中的虚函数(__thiscall)地址 实验04-2:替换C++虚函数

IStream 接口

IStream 接口 https://msdn.microsoft.com/en-us/library/windows/apps/aa380034 IStream接口允许您读取和写入 stream 对象的数据.流对象包含结构化的存储对象,存贮在哪里提供结构中的数据.简单的数据可以直接写入流,但最频繁,溪流是元素嵌套在一个存储对象.他们是类似于标准的文件. IStream接口定义方法类似于的 MS-DOS 脂肪的文件功能.例如,每个流对象都有其自己的访问权限和查找指针.DOS 文件和流对象之间的主

关于 "Context" 模式(基于COM思想IUnknown思想)

有同事很喜欢用Context模式,觉得是自己"首创", 我有些自己的想法, 或者大家可以发表下自己的观点. 什么是Context模式? 23种设计模式中没有这个模式, 是同事自己命名的, 我觉得名字也挺合理. Context模式首先要满足的条件是类都是基于COM思想IUnknown接口 继承于IUnknown有2个基本接口, 一个是IContext, 另外一个是IComponent IContext的作用是保存一个Map, 里面存有接口IID和接口指针的映射关系 IComponent的

COM组件设计与应用(二)——GUID和接口

本文摘自:http://blog.vckbase.com/teacheryang/archive/2005/06/27/8884.html 一.前言 书接上回,话说在 doc(Word) 复合文件中,已经解决了保存 xls(Excel) 数据的问题了.那么,接下来又要解决另一个问题:当 WORD 程序读取复合文件,遇到了 xls 数据的时候,它该如何启动 Excel 呢?启动后,又如何让 Excel 自己去读入.解析.显示 xls 数据呢? 二.CLSID 概念 有一个非常简单的解决方案,那就是

com组件接口

int main( int argc, char *argv[] ) {    cout << "Initializing COM" << endl;    if ( FAILED( CoInitialize( NULL )))    {       cout << "Unable to initialize COM" << endl;       return -1;    }    ISampleMath* pSa

《COM原理与应用》学习笔记二——COM对象和COM接口的实现

COM对象是给用户提供服务的封装的实体.这个应该和C++中类的对象理解起来是相似的.但是有时候也把COM对象当作提供服务的那个类.COM对象也对数据进行了封装,然后也提供了接口.不过和类还是有一些不一样的.类中的数据可以申明为public,然后让用户能够直接访问这些数据成员.但是用户不能对COM对象的数据进行直接访问,只能通过接口(如果有提供这种接口的话)来对数据进行间接的访问.一般COM接口指的是一组提供服务的接口,刚开始看这个定义很不习惯.因为C++中根本没有接口的概念,但是像Java这些语