一 组件基础
1 软件开发的阶段
1.1 结构化编程
采用自顶向下的编程方式,划分模块
和功能的一种编程方式。
1.2 面向对象编程
采用对象的方式,将程序抽象成类,
模拟现实世界,采用继承、多态的方式
设计软件的一种编程方式。
1.3 面向组件编程
将功能和数据封装成二进制代码,采用
搭积木的方式实现软件的一种编程方式。
2 组件和优点
2.1 组件 - 实际是一些可以执行的二进
制程序,它可以给其他的应用程序、操
作系统或其他组件提供功能
2.2 优点
2.2.1 可以方便的提供软件定制机制
2.2.2 可以很灵活的提供功能
2.2.3 可以很方便的实现程序的分布式
开发。
3 组件的标准 - COM(Component Object Model )
3.1 COM是一种编程规范,不论任何开发语言
要实现组件都必须按照这种规范来实现。
组件和开发语言无关。
这些编程规范定义了组件的操作、接口的
访问等等。
3.2 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.2.3 使用接口的函数
4 接口的生命期
4.1 问题
在DLL中使用new创建接口后,在用户
程序使用完该接口后,如果使用delete
直接删除,会出现内存异常.
每个模块有自己的内存堆(crtheap)
EXE - crtheap
DLL - crtheap
new/delete/malloc/free默认情况
下都是从自己所在模块内存堆(crtheap)
中分配和施放内存.而各个模块的
这个内存堆是各自独立.所以在DLL中
使用new分配内存,不能在EXE中delete.
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 每个接口都具有唯一
1