使用Delphi来跟我学COM ,第二部 COM编程

第六章 DCOM

目的: 客户和服务器端使用DCOM,以及实现远程数据集;

DCOM:分布式COM;

DCOM服务器与COM服务器没有区别,只是位于远程电脑上;

DCOM服务器的配置:

DCOM的调用: 必须通过Proxy/Stub对象,并且是通过RPC协议;

CoClass的CreateRemote方法(Create调用本地);

Proxy: 远程COM对象在应用程序执行中的影象(Image),封装应用程序的调用信息;

Stub:接受Proxy调用信息,再使用这些信息调用真正的DCOM对象;然后调用结果回传给Proxy,由Proxy回传给应用程序;

RPC(Remote Procedure Call): 通信协议,使用DCOM时必须激活;

SCM(Service control Manager):

线程模型: 同COM的模型;

组件模型: COM/DCOM组件模型;

COM/DCOM组件模型是一种平台独立、分布式、面向对象的系统,用于创建可相互作用的二进制软件组件。COM/DCOM是微软的OLE(复合文档)和ActiveX(可用于Internet的组件)以及许多其它技术的基础技术;

COM/DCOM之所以被认为是一种二进制标准,是因为它是一种在应用程序被编译成二进制机器码之后才起作用的标准;

COM/DCOM不是一种面向对象语言,它也不指定一个应用程序如何构造,它是一种标准,它指明一种组件模型和使组件之间能够相互操作的编程需求。COM/DCOM组件可以运行在单一进程、不同进程、甚至是远端机器;

COM/DCOM组件可以通过许多编程语言来创建。许多面向对象语言,诸如C++,都提供可简化COM/DCOM组件实现的编程机制;

COM/DCOM定义了一个COM/DCOM组件的核心实质。一般来说,一个软件组件由一组数据以及管理这些数据的函数构成。一个COM/DCOM组件是这样的一种软件组件,它专门通过一组或多组相关的函数存取组件数据。这些函数集合称为接口,而接口的函数称为方法。对COM/DCOM来说,它需要的唯一的调用接口方法的途径就是指向接口的指针;

编译好的COM/DCOM组件是不能修改的,要增加新的功能只能由开发商对组件源码进行修改、更新,然后重新编译生成新的COM/DCOM组件;

[第六章 DCOM][第七章 COM+][第八章 结构化存储]

第七章 COM+

目的: COM+的理解,如何利用系统资源,如何使用COM+,如何开发有效的COM+系统;

MTS(Microsoft Transation Server): 是M$在Windows平台的中介软件之一;

主要功能:

让Windows程序员开发以组件为导向的分布式应用系统;

具备在同质和异质数据库之间的数据进行Two Phase Commit的功能;

大量的客户端应用程序能够同时执行;

提供数据库事务的管理工作,客户端只要调用中介企业对象的服务、而不需要自行调用StartTranstion等数据库事务模式的程序代码;

MTS本身是一个COM/DCOM对象的Container环境;MTS对象是In-Process COM对象;

提供许多具备延展性的功能:资源pooling、执行pooling、数据库连接pooling、JIT(Just In Time)对象激活等;

MTS组件:本质上是一个COM/DCOM组件;只是MTS组件有一些基本的要求,如下:

MTS对象必须实现IObjectControl接口;

MTS对象必须具有Type Library信息;

MTS对象对象必须由标准类别厂商对象建立,即MTS对象必须支持IClassFactory接口;

MTS对象必须实现IDispatch接口,使用COM标准的marshaling机制;

简单的说:MTS对象必须支持Automation接口,以便让C++、Pascal以及脚本语言调用;

MTS套件组件: 数个实现MTS对象相关的DLL组合成一个单位,分发时以这个单位为分发的基础;

函数库套件组件(Library Package):和客户端应用程序一起安装到客户端中;

服务器套件组件(Service Package):执行在MTS的执行环境中;客户端调用时,要进行远程调用;

CW(Content Wrapper):MTS对象的影像; 可以Object Pooling;节约资源;

OC(Object Context对象):让MTS对象存取MTS执行环境提供的服务;

MTS对象和COM/DCOM对象的区别:MTS对象有一个CW对象,提供了前置处理(Pre-process)以及后续处理的工作(Post-Process);

COM+介绍:

在Win2000和WinXP中,使用COM+是所有在windows平台中开发应用系统不可回避的事情;

以后的Windows系统中,以COM+作为中介引擎来开发多层应用系统是唯一的选择;

COM+的系统架构:

程序模型:属性程序模型,组件的执行行为属性由它的执行环境COM+环境来管理;

可以使用MTS Explorer设定的执行属性包括组件的事务属性、组件的安全属性、对象Pooling、平衡负荷、同步处理;

Configured组件和Non-Configured组件:

Configured组件:安装在服务器应用程序中的COM+组件;有相关的执行行为属性;

Non-Configured组件:通过注册表注册的组件;没有相关的执行行为属性;如ADO组件;

COM+与MTS环境的区别:COM+主要功能在COM+执行时期函数库和COM+的Stub中;

COM+没有CW对象:直接调用COM+的实体样例;

COM+执行在DllHost.Surrogate的应用程序中;

COM+模型中对象都执行在Context环境中;

状态对象和无状态对象:

状态对象: 为客户端维护内部信息使用以下方法:

使用状态对象;

把内部信息写入MTS属性群组中,下次调用时再从属性群组中加载原先储存的信息;

让MTS对象执行完后不要调用SetComplete或SetAbort;

把信息储存在数据库或其他的文件中;

无状态对象:当COM对象服务完客户端后释放所有的内部信息;

事务管理:系统执行企业逻辑程序代码;程序代码的单一的运算必须符合ACID(Atomicity、Consistency、Isolation、durability)标准;

数据库事务管理:

COM+系统允许程序员使用企业对象在分布式计算环境中对同质与异质数据库中的数据进行Two-Phase Commit的控制;

只要通过COM+在组件层次提供的事务管理功能,再搭配ADO数据库驱动程序,应用系统能够自动享受COM+执行环境提供的事务管理功能;

程序员不应该在客户端中自己撰写控制数据来源事务的程序代码(StartTranstion等);

Two-Phase Commit:参与数据来源更新的资源保证正确的更新,或在任何参与的资源发生错误时能够完全的恢复数据在未更新之前的状态;

COM+事务对象:激活数据库事务行为开始的地方;事务对象开始执行后,COM+会建立一个事务Context,调用其他的COM+对象时事务Context会随着流动;事务对象是MTS/COM+中最重要的对象;

按COM+事务的属性而区分的类别:

需要事务:执行时一定需要事务Context的存在;如果已经存在就使用存在的事务Context;

建议:在撰写数据对象、事务对象、协调对象可以使用这种对象;

一般情况下,这种对象是因为要处理数据的修改才会需要一个事务;

需要新的事务:COM+对象在激活时建立一个新的事务Context;而不使用客户端已建立的;

COM+对象在它建立的事务Context中执行,绝对不会在客户端的事务Context中执行;

COM+对象需要建立额外的负荷,COM+的事务不受客户端事务Context控制;

要小心建立这种事务;

支持事务:可以在客户端的事务Context中执行,也可以在没有事务Context的状况下执行;

建议:开发功能对象、控制对象、协调对象时可以选择建立这种对象;

COM+组件是否执行在事务Context中,完全决定于客户端;

不支持事务:不会在COM+的事务Context中执行;

建议:开发COM+对象时尽量不要建立这种对象;

Ignores Transtions:

MTS/COM+对象的事务属性决定了MTS/COM+是否会进入事务模式以及建立事务Context;

资源管理: MTS/COM+最主要的功能Two-Phase Commit是依靠资源管理来完成;

资源管理者(Resource Manager): 管理所有的永续储存媒体的软件组件;

使永续储存媒体(数据库服务器、信息列、文档系统等)参与MTS/COM+的Two-Phase Commit工作;

资源分配者(Resource Dispenser):管理所有的非永续储存媒体的软件组件;

使非永续储存媒体(数据库连接、内存、信息、线程及对象等)参与MTS/COM+的Two-Phase Commit工作;

使非永续储存媒体储存的资源具备Pooling的能力;

MTS/COM+事务生命周期: 事物管理的过程可以分为四个阶段;

1、激活事务管理:当客户端调用“需要事务”或“需要新的事务”时建立MTS/COM+组件;

2、注册事务管理需要使用的资源管理者: 事务管理中受Two-Phase Commit的保护;

3、执行事务:COM组件执行自己的逻辑代码;

4、事务管理结束:数据的更新、资源的释放;事务管理执行结果是否Commit或RollBack;

MTS/COM+安全机制:

[第六章 DCOM][第七章 COM+][第八章 结构化存储]

第八章 结构化存储

结构化存储与接口一样,是一种技术;

8.1 结构化存储:

目的: 了解什么是结构化存储、和结构化存储文件;

结构化存储文件(DocFiles):提供了一个强大的结构化的保存持续信息的方式;

结构化存储:单独文件中的一个复杂的文件系统;

结构化存储用语: 目录对应一个存储(storage),文件对应一个流(stream);

8.2 结构化编程:

目的:如何在应用程序中创建、打开、读写结构化存储文件;

创建结构化存储文件:function stgCreateDocFile(...):HResult;stdcall;

打开结构化存储文件:fucntion stgOpenStorage(...): HREsult; stdcall;

流(Streams)编程:写文件前要筹建流;

创建流: IStorage.CreateStream;

打开流: IStorage.OpenStream;

读取流: IStream.Read; Delphi中在读取数据时采用IOleStream;

向流中写数据: IStream.write; Delphi中常常采用TOleStream的类;

创建和使用附加存储(Additional Storages):在存储中创建和访问流;还可以创建子存储;

创建附加存储: IStorage.CreateStorage;

打开已存在的存储(不是根存储):IStorage.OpenStorage;

8.3 小结:

目的:结构化存储的使用;

结构化的概念、及如何使用;

注意: 打开文件和流的少量额外代码,只需使用TOleStream来读写文件;

[第六章 DCOM][第七章 COM+][第八章 结构化存储]

参考书籍:

Delphi5.X ADO/MTS/COM+ 高级程序设计篇

Delphi COM Programming

Effective COM

Inside COM

注: 1、谢谢大家的光临;

2、有不当的理解之处请大家指正,谢谢;

3、结构化存储还没有完全理解,所以不是很详细;

4、原来采用XHTML的格式,很多不能粘帖上来,请谅解;

5、最后谢谢大家的支持;