综合

img williamVII

第三章 类

发表于2004/9/16 11:19:00  947人阅读

分类: COM技术

再谈接口与实现

 

接口:对象进行通信的抽象协议.

实现:支持一个或者多个接口的具体数据类型.

:被命名的实现.它代表了具体的可实例化的类型,称为COM类或coclass

CLSID用来命名实现,COM也支持文本方式的别称ProgID, 利用一组COM API可实现相互转换

类对象

所有COM类的一个基本要求是它们必须有一个类对象.(类厂)

对于每个类来说,类对象是独一无二的,它实现了该类的创建功能.

激活

三种激活模型: 绑定到类对象(必需),绑定到类实例,绑定到来自文件的永久实例

SCM是一台机器上所有激活请求的中心控制点.凡是支持COM的每台主机上都有本地的SCM,由它远程激活请求转发给远程机器上的SCM,在远程机器上这个激活请求将被当作本地激活请求来对待.

SCM只被用于激活对象和绑定初始接口指针,一旦一个对象已经被激活,SCM就不再介入客户与对象之间的方法调用过程中.

SCMRPCSS实现

对象被激活在客户进内部时,实现对象方法的DLL将被装载到客户进程中,这使方法调用非常高效.

对象在另一个进程中(本地或者远程)被激活时,实现对象方法的代码将在服务器进程中执行对象所有数据成员都驻留在服务器进程地址空间中,COM在激活时透明地返回客户一个代理对象, 运行在客户线程中, 把方法调用翻译成实际对象上的方法调用

使用SCM

层次结构: 绑定到类对象(必需,最底层) <- 绑定到类实例 <-绑定到来自文件的永久实例

COM API coGetClassObject()得到类对象,再使用类对象得到对象.

类与服务器

COM记录了一个配置数据库(NT目录), COM使用类存储(COM类的信息)CLSID解析到实现文件名

注册表相关:DllRegisterServer , DllUnregisterServer

DLL引出DllGetClassObject,coGetClassOjbect调用

一般化

用于对象发现的接口: IoleItemContainer

用于对象创建的接口: IclassFactory

优化

COM API: CoCreateInstanceEx包含了CoGetClassObjectIClassFactory::CreateInstance的功能.

客户不会看到类对象,QueryInterface在类对象内部进行,提高了性能

且允许客户请求多个指向新对象的接口指针

阅读全文
0 0

相关文章推荐

img
取 消
img