COM道理及应用—- 布局化存储
副标题#e#
1、布局化存储
COM的布局化存储(structured storage)机制,也称为永久存储(persistent storage)机制。布局化存储可以说是软件存储技能的一个重要希望,COM针对组件软件的需要,在文件系统的基本上,提出了布局化存储的观念。操作布局化存储,组件措施之间可很好地协同事情,一个组件措施可以与另一个组件措施共享同一个文件,就如同一个应用措施与另一个应用措施共享同一个磁盘文件系统一样。
COM界说了布局化存储的类型,包罗一组接口和实现这些接口成员函数的一些法则;同时COM也提供了布局化存储的实现,即复合文档技能。复合文档技能是 OLE的基本。OLE最初的方针是在文档中嵌入或链接工具,虽然此刻OLE的成长已经超出了这个范畴,但复合文档仍然是OLE的基本存储技能。
2、布局化存储的引入
组件化措施设计要领把应用系统设计成多个组件措施,如安在这些组件措施之间以共享方法会见同一个文件是组件化措施设计必需要办理的问题。而多个组件通过文件句柄会见共享文件难以实现,布局化存储技能“借用”文件系统的观念,在文件内部结构了一个雷同于文件系统的树状条理布局,办理了这一问题。
布局化存储的条理布局的节点可以是两种工具:存储工具和流工具,每个存储工具可能流工具都是一个可独立举办读写操纵的工具,组件措施只对它拥有的节点工具举办操纵。从应用系统整体上看,这些组件措施在共享会见同一个文件。
3、文件系统
操纵系统的降生把应用措施与底层存储设备隔分开来,操纵系统为应用措施的运行提供了根基的抽象情况,它可以处理惩罚所有与存储设备有关的根基操纵。同时,操纵系统引入了文件系统的观念,答允多个应用措施共享同一个存储设备。并且,操纵系统为应用措施提供了一种抽象的流式存储布局,应用措施仍然独立地会见它本身的存储空间,差异应用措施彼此之间不受滋扰。
4、文件系统与布局化存储的框图
5、存储工具和流工具
对付一个完整的存储操纵来说,它被分为两个条理:应用措施挪用API函数;操纵系统提供API函数的实现。COM库提供了布局化存储的实现,它提供了一组接口和API函数供组件措施挪用来完成实际的存储操纵。因此,布局化存储界说的存储工具和流工具由COM库实现,应用措施可能组件措施并不需要实现这两个工具,就比如应用措施不需要实现文件句柄可能目次工具一样。
流工具很是雷同于单独的磁盘文件,它也是举办数据读写操纵的根基工具,操作流工具可以生存各类范例的数据,它有自身的会见权限和一个独立的搜索指针。流工具也用一个字符串作为其名称,就仿佛文件名一样。流工具是一个由COM实现的组件工具,它实现了根基的COM接口IStream,应用措施通过 IStream接口会见流工具,举办各类数据会见操纵。
存储工具雷同于目次工具,它也有一个字符串名称,但它自己并没有存储数据信息,它作为其子存储工具和子流工具的容器,只记录了这些子工具的信息。存储工具袒露IStorage接口,客户措施通过IStorage接口对存储工具举办操纵。
应用措施可能组件措施可以通过布局化存储机制共享同一个复合文件,存储工具和流工具也可以在这些措施之间被共享会见,纵然这些措施运行在差异的历程中。
6、布局化存储特性――会见模式
存储工具和流工具支持两种根基的会见模式:直接会见和事务会见模式。在直接会见模式下,措施对存储工具可能流工具的修改操纵顿时生效;而在事务模式下,措施对存储工具可能流工具所作的修改被缓存起来,只有当提交(Commit)时才真正有效,假如挪用Revert成员函数,则可以规复到上次提交或刚打开时的状态。
7、布局化存储特性――事务机制
在布局化存储的树状条理布局中,事务特性可以合用于所有条理上的工具,因此,事务特性可以嵌套利用。
事务机制需要耗损较多系统资源。
8、布局化存储特性――定名法则
在布局化存储的树状条理布局中,每个存储工具和流工具都有一个字符串名字。
根存储工具的名字实际上就是复合文档的文件名,所以根存储工具的定名法则受文件系统影响,它遵守文件系统的定名约定。与建设和打开根存储工具有关的函数中,直接利用文件名即可。所有非根存储工具和流工具都由它们的父工具打点,由于它们存在于文件内部,因此它们的定名法则遵守COM给出的约定。
#p#副标题#e#
9、布局化存储特性――增量会见
增量会见的意义在于淘汰了生存和打开文件时的操纵时间和低落了应用措施对系统资源的要求。
#p#分页标题#e#
对付大的复合文件的编辑操纵,内存往往是个瓶颈,布局化存储自己也需要耗损一些系统内存资源,但它实现的增量会见反而低落了应用措施对内存的要求,同时也提高了系统的机能。
布局化存储也带来了另一个问题,那就是空间接纳的打点。频繁地对同一个复合文件举办修改、生存,则文件的尺寸老是在增长,原因在于删除工具时,COM只是把这些所占用的磁盘空间标志为“未用”,而没有释放这些磁盘空间。虽然COM今后大概会重用这些空间,但在重用之前,这些空间仍保存在文件中。办理这个问题的要领是:首先建设一个新的复合文件,然后挪用原先根存储工具的CopyTo函数,把以前的树布局复制到新的根存储中,则新的复合文件没有碎片空间。
Microsoft Access或Word发生的文件就会呈现这种环境。
10、布局化存储实现:复合文档
从布局化存储的工具布局可以看出,要在特定的系统平台上实现布局化存储,要害在两方面:一是如何把根存储与底层存储介质团结起来,二是实现存储工具和流工具。
复合文档通过一个被称为“LockBytes”的工具,把根存储与底层的存储介质接洽起来,其他的子工具则通过根存储与底层存储介质举办数据通信,从而实现了整个布局化存储体系布局。底层介质不只可以是磁盘文件,复合文档也答允是内存空间,甚至是用户自界说的虚拟空间。LockBytes工具实际上是所有存储介质的一种抽象表达方法,它把存储介质描写成一般化的字节序列,不管是磁盘文件照旧内存区域都可以按字节序列看待。
COM库提供了缺省的基于文件句柄操纵的LockBytes工具,我们可以操作此 LockBytes工具成立复合文件。COM库还提供了基于内存的LockBytes工具,我们可以操作内存LockBytes工具成立内存中的复合文档。并且,COM还答允我们实现本身的LockBytes工具,并在自界说LockBytes工具的基本上成立复合文档。
11、复合文档API函数
建设复合文档API函数:StgCreateDocfile和StgCreateDocfileOnLockBytes。
打开已经存在的复合文档API函数:StgOpenStorage和StgOpenStorageOnLockBytes。
在内存基本上建设LockBytes工具可能流工具的API函数:CreateILockBytesOnHGlobal、 GetHGlobalFromILockBytes、CreateStreamOnHGlobal、GetHGlobalFromStream。
其他的API函数:StgIsStorageFile和StgSetTimes。
12、零内存生存特性和IRootStorage接口
复合文档通过LockBytes工具把根存储工具与底层的文件操纵隔分开来,所以我们在会见存储工具可能流工具时避开了文件句柄操纵。当我们用事务方法打开复合文件时,COM实际上用到了三个文件句柄,一个是复合文件句柄,另一个是姑且文件句柄,该姑且文件记录了存储工具操纵进程中的修改信息,尚有一个句柄用作在零内存环境下生存文件时预分派的文件句柄。
13、存储工具、流工具和文件的CLSID信息
通过IStorage接口的SetClass函数可觉得一个存储工具赋一个CLSID标识符,并可通过Stat函数获取此CLSID值。实际上,存储工具通过此CLSID值把它与一段可执行代码接洽起来,当客户措施但愿执行与存储工具相接洽的代码时,它操作CLSID值,并挪用 CoCreateInstamce函数建设一个COM工具,再把存储工具交给COM工具,由它处理惩罚存储工具。这样的COM工具称为永久工具(persistent object),它凡是实现了IPersist***接口,好比IPersistFile、IPersistStorage、 IPersistStream和IPersistStreamInit等,客户措施通过这些接口举办数据互换。
COM也提供了几个API函数用于存储工具可能流工具执行与CLSID有关的一些通例操纵:
(1)WriteClassStg和ReadClassStg函数封装了 IStorage::SetClass和IStorage::Stat成员函数,可以完成存储工具的CLSID的配置和获取操纵。存储工具只是个容器,它自己不包括数据信息,所以它的CLSID信息被写在其下面的一个子流工具中,其名字为“x01CompObj”。
(2)WriteClassStm和ReadClassStm函数利用一致的名目在流工具的当前位置别离写可能读CLSID信息,凡是环境下,我们在流的起始处安排CLSID信息。
(3)GetClassFile函数返回一个与给定文件相接洽的CLSID。Windows桌面情况操作它把数据文件与应用措施接洽起来,实现了桌面情况中的数据驱念头制。
对付非复合文档,Windows提供了两种要领可以成立这样的接洽。
(1)Windows系统注册记录了文件扩展名与ProgID之间的接洽,而ProgID又指定了CLSID,所以该文件扩展名与CLSID接洽起来了。
(2)Windows系统注册表提供了一些文件匹配法则,在HKEY_CLASSES_ROOTFilType键下记录了一些CLSID与它们的匹配法则。
14、复合文档与布局化存储
#p#分页标题#e#
布局化存储是COM类型的一部门,它描写了一个抱负的存储机制,而复合文档作为它在Windows平台上的实现,它操作操纵系统的特点增加了一些新的特性,但也不行制止地受到一些限制。复合文档是今朝Windows平台上的根基存储机制。
15、永久接口
客户措施通过永久接口维护永久工具的状态信息,而状态信息可以被存放在各类介质中,好比存储工具、流工具可能文件中,按照介质的差异,COM界说了四个常用的永久接口:IPersistFile、IPersistStorage、IPersistStream和IPersistStreamInit,它们都派生自根基的IPersist接口。客户措施可以向永久工具请求这些接口,然后通过接口读写工具的状态信息。
16、永久工具的存储特性
永久工具通过三种介质生存状态数据,别离为流工具、存储工具和文件。永久工具在三种介质上生存状态数据的特性是差异的,操纵进程也是差异的。
实际上,一个永久工具可以实现多个永久接口以便提供多种介质的存储支持。从措施实现来讲,这是一个多接口支持问题,从客户措施来讲,它只能利用一种接口,按照客户措施的特性,它可以优先选择一个永久接口。