COM原理及应用---- 结构化存储
8、结构化存储特性――命名规则 在结构化存储的树状层次结构中,每个存储对象和流对象都有一个字符串名字。 根存储对象的名字实际上就是复合文档的文件名,所以根存储对象的命名规则受文件系统影响,它遵守文件系统的命名约定。与创建和打开根存储对象有关的函数中,直接使用文件名即可。所有非根存储对象和流对象都由它们的父对象管理,由于它们存在于文件内部,因此它们的命名规则遵守COM给出的约定。 9、结构化存储特性――增量访问 增量访问的意义在于减少了保存和打开文件时的操作时间和降低了应用程序对系统资源的要求。 对于大的复合文件的编辑操作,内存往往是个瓶颈,结构化存储本身也需要消耗一些系统内存资源,但它实现的增量访问反而降低了应用程序对内存的要求,同时也提高了系统的性能。 结构化存储也带来了另一个问题,那就是空间回收的管理。频繁地对同一个复合文件进行修改、保存,则文件的尺寸总是在增长,原因在于删除对象时,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对象,再 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |