COM学习笔记——基础

一	组件基础

	1. 软件开发的阶段
		1.1 结构话编程
			采用自顶向下的编程方式,划分模块和功能的一种编程方式。
		1.2 面向对象编程
			采用对象的方式,将程序抽象成类,模拟现实世界,采用继承/多态的方式设计软件的一种编程方式。
		1.3 组件编程
			将功能和数据封装成二进制代码,采用搭积木的方式实现软件的一种编程方式。
	2. 组件和有点
		2.1 组件 - 实际是一些可以执行的二进制程序,它可以给其他的应用程序、操作系统或其他组件提供功能。
		2.2 优点 
			2.2.1 可以方便的提供软件定制机制。
			2.2.2 可以很灵活的提供功能。
			2.2.3 可以很方便的实现程序的分布式开发。
	3. 组件的标准 - COM
		3.1	COM是一种编程规范,不论任何开发语言要实现组件都必须按照这种规范来实现。
			组件和开发的语言无关。
			这些编程规范定义了组件的操作、接口的访问等。
		3.2 COM接口
			COM接口是组件的核心,从一定程度上讲,COM接口是COM组件的一切。
			COM接口给用户提供了访问组件的方式。通过COM 接口提供的函数,可以使用组件的功能。
	4. COM组件
		4.1 COM组件就是在Windows平台下封装在动态库(DLL)或者可执行文件(EXE)中的一段代码。
			这些代码是按照COM的规范实现。
		4.2 COM组件的特点
			4.2.1 动态链接
			4.2.2 与编程语言无关
			4.2.3 以二进制的方式发布
二 	COM接口
	1. 接口的理解
		DLL的接口:DLL导出的函数。
		类的接口: 成员函数。
		COM的接口:是一个包含了一组函数指针的数据结构。这些函数都是由组件实现的。
	2. C++的接口实现
		2.1 C++实现接口的方式,使用抽象类定义接口。
		2.2 基于抽象类派生出子类并实现功能。
		2.3 使用Interface定义接口
			interface ClassA
			{
			}
			目前VC中,Interface其实就是struct。
	3. 接口的动态导出
		3.1 DLL的实现
			3.1.1 接口的定义
			3.1.2 接口的实现
			3.1.3 创建接口函数
		3.2 DLL的使用
			3.2.1 加载DLL获取创建接口的函数
			3.2.2 创建接口
			3.3.3 使用接口的函数
	4.接口的生命周期
		4.1 问题
			在DLL中使用new创建接口后,在用户程序使用完该接口后,如果使用delete操作符直接删除,会出现异常。
			new / delete / malloc / free 默认情况下都是从自己所在模块内存堆(crtheap)中分配内存。各个模块的内存堆是各自独立的。
			所以在DLL中使用new分配内存,不能再EXE中delete掉。
			EXE —— crtheap
			DLL—— crtheap
		4.2 引用计数和AddRef / Release
			引用计数 - 就是一个整数,作用是表示接口的使用次数。
			AddRef	- 增加引用计数 +1
			Release	- 减少引用计数 -1
			当引用计数为0,接口被删除
		4.3 使用
			4.3.1 创建接口
			4.3.2 调用AddRef,增加引用计数
			4.3.3 使用接口
			4.3.4 调用Release,减少引用计数
		4.4 注意
			4.4.1 在调用Release之后,接口指针不能再使用。
			4.4.2 多线程情况下,接口的引用计数要使用原子锁的方式进行加减。
	5. 接口的查询
		5.1 每个接口都具有一个唯一标识GUID
		5.2 实现接口查询函数
			QueryInterface
	6. IUnknow接口
		6.1 IUnknown是微软定义的标识接口。我们实现的所有接口就是继承于这个接口。
		6.2 IUnknown定义了三个函数
			QueryInterface 接口查询函数
			AddRef 	增加引用计数
			Release 减少引用计数
	7. IDL - 接口定义语言
		7.1 IDL和MIDL
			IDL - 定义接口的一种语言,与开发语言无关。
			MIDL .EXE - 可以将IDL语言定义的接口,编译成C++语言的接口定义。 
		7.2 IDL的基础
				import "XXX.idl"
				[
					attrib
				]
				interface : interface_base
				{
				}
			7.2.1 Import 导入,相当于C++的#Include
			7.2.2 使用“[ ]”定义区域,属性描述
				关键字
				1)Object -后续是对象
				2)uuid - 定义对象GUID
				3)helpstring - 帮助字符串
				4) version -版本
				5) point_default -后续对象中指针的默认使用方式。
						比如:unique - 表示指针可以为空,但是不能修改
			7.2.3 对象定义
				1)父接口是IUnknow接口 
				2)在对象内添加函数,函数定义必须是返回HRESULT。
					HRESULT 是32位整数,返回的是函数是否执行成功,使用SUCCEEDED和FAILED宏来判断返回值。
三	COM接口(2)
	1. COM接口的规范
		1.1 IUnknow接口的等价性 - 
			判断两个接口是不是相等,需要获取两个接口的IUnknow接口,判断IUnknow接口的地址是否相等。
		1.2 自反性
			接口可以使用QueryInterface查询到自己。
		1.3 对称性
			接口A可以查询到接口B,那么接口B也可以查询到接口A。
		1.4 传递性
			接口A可以查询到接口B,接口B可以查询到接口C,那么接口A可以查询到接口C。
		1.5 时间无关性
			接口A在某个时间可以查询到接口B,那么在后续的任何时间中也可以查询到接口B。
	2. 接口的编写
		2.1 定义IDL
		2.2 实现接口
		2.3 实现接口的导出


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值