COM组件设计与应用(十七)——持续性

一、前言

我们写程序,经常需要实现这样的需求:

例一、程序运行产生一个窗口,用户关闭的时候需要记录窗口的位置,以便下次运行时保持位置不变;

例二、由于程序运行时间很长,今天执行一部分,明天继续执行。那么在下次运行前要恢复前次的状态;

... ... ... ...

智慧的老师:以上这些需求,如何实现呢?

懵懂的学生:这个简单,只要在程序退出前提取必要的信息保存到文件中,下次运行时再从文件中读出来,设置一下就OK了。

智慧的老师:恩,不错,这位同学的思想值得表扬。

懵懂的学生:不好意思,这都要感谢老师的栽培,我对您的景仰如滔滔江水......

智慧的老师:别臭P了,我话还没有说完那......如果你需要提取和保存的信息很多,结构很复杂......怎么办?

懵懂的学生:也好办,我设计一个结构来记录这些信息。

智慧的老师:恩......不错。但如果这些信息提供方是别人写的模块,并且随着版本的不同还经常变化,你怎么办?

懵懂的学生:... ...

智慧的老师:解决这些问题的方法是---持续性。

二、原理

持续性,也叫永久性。组件方提供 IPersistXXX 接口,调用者(容器)提供存储介质,比如文件啦、内存啦、注册表啦、流啦、文本啦......啦啦拉。需要保存的时候,调用者通过 IPersistXXX::Save() 接口函数让组件去自己存储属性信息,而调用者根本不用关心存储格式和存储内容;需要还原状态的时候,调用者打开存储介质,然后同样调用 IPersistXXX::Load() 接口函数让组件自己去读取属性信息并完成初始化的设置。

目前,微软定义了如下各种类型的持续性接口,足够满足你的需求了。我们只要在自己写的组件中实现其中一个或几个持续性接口,那么调用者就可以按照统一的方式和我们的组件协商完成属性信息的保存和状态还原了。

持续性接口 简要说明
IPersist 所有持续性接口的根,下面的接口大多从它派生出来。这个接口很简单,只有一个函数 GetClassID()它返回组件的 CLSID 号,以便调用者能保存这个号为将来 CoCreateInstance() 启动组件用。

实现这个函数也很简单,只要返回你组件中的 CLSID_XXX 即可,或者比较省事的方法是返回 GetObjectCLSID() 。

IPersistStream
派生自 IPersist,并增加了4个函数,从流(IStream)中读写组件属性信息。

IsDirty() 组件内部属性是否发生了变化。为调用者是否需要保存信息提供依据
Load() 从 IStream 中读入信息,初始化组件属性
Save() 把属性信息保存到 IStream 中
GetSizeMax() 返回信息尺寸,以便调用者事先开辟空间
IPersistStreamInit 派生自 IPersistStream,并再增加了一个函数 InitNew() 用来完成一个默认的组件属性初始化。

这个持续性接口是最常用的,本文示例中就实现了该接口。

IPersistMemory 和 IPersistStreamInit 类似,但使用的是内存块,而不是大小可变化的 IStream 流。
IPersistStorage 和 IPersistStream 类似,但保存属性信息使用的是存储 IStorage,一个 IStorage 中可以有多个 IStream。
IPersistFile 和 IPersistStream 类似,但存储介质为文件。
IPersistPropertyBag 使用属性包(属性名、属性值)的文本方式保存信息。在 IE 浏览器中,HTML 嵌入 ActiveX 控件通常使用这个方法。

在 HTML 中插入控件,<param name="属性名称" value="值"> 这样的形式你应该见过吧?!

在下一回的文章中,我们介绍这个接口。因为在 ActiveX 中,它太常用了。

IPersistPropertyBag2 扩展了 IPersistPropertyBag 接口。提供了更丰富一些的属性管理用函数。
IPersistMoniker 用于命名(moniker)存储和读取状态的持续性接口。
IPersistHistory 运行于 IE 上,想在用户浏览 WEB 页面时存储和读取状态的持续性接口。
时间: 2025-01-21 16:49:23

COM组件设计与应用(十七)——持续性的相关文章

Asp.net组件设计浅论

asp.net|设计 一.什么是组件? 查看MSDN,微软是这样给组件定义的:在 .NET Framework 中,组件是指实现 System.ComponentModel.IComponent 接口的一个类,或从实现 IComponent 的类中直接或间接派生的类.这是从纯语言(技术)角度下的定义,通俗的讲,组件是"可独立运作的软件单元",这里强调独立运作,也就代表着组件必须拥有低耦合性.高重用性等特点.微软将软件划分为两部分:其一是Component,意指具备特定功能.可独立运作.

漫谈Visual C#的组件设计方法

visual|设计 Properties 在C#中为类预定义属性是件再简单不过的事,见程序1. 程序1 using System;namespace PropertiesDemo{ public class MyData { ............... } public class Class1 { private MyData _data; public MyData Data { get { return _data; } } public Class1() { _data = new

COM组件设计与应用(六)——用ATL写第一个组件(vc.net)

一.前言 1.与 <COM 组件设计与应用(五)>的内容基本一致.但本回讲解的是在 vc.net 2003 下的使用方法,即使你不再使用vc6.0,也请和上一回的内容,参照比对. 2.这第一个组件,除了所有 COM 组件必须的 IUnknown 接口外,我们再实现一个自己定义的接口 IFun,它有两个函数: Add()完成两个数值的加法,Cat()完成两个字符串的连接. 3.下面......好好听讲! 开始了:-) 二.建立 ATL 工程 步骤2.1:建立一个解决方案. 步骤2.2:在 该解决

COM组件设计与应用(一)起源及复合文件

一.前言 公元一九九五年某个夜黑风高的晚上,我的一位老师跟我说:"小杨呀,以后写程序就和搭积木一样啦.你赶快学习一些OLE的技术吧......",当时我心里就寻思 :"开什么玩笑?搭积木方式写程序?再过100年吧......",但作为一名听话的好学生,我开始在书店里"踅摸"(注1)有关OLE的书籍(注2).功夫不负有心人,终于买到了我的第一本COM书<OLE2 高级编程技术>,这本800多页的大布头花费了我1/5的月工资呀......

AOP@Work: 用Contract4J进行组件设计-用契约式设计和AspectJ改进软件

简介:契约式设计(Design by Contract)是切实可行的技术,可以阐明组 件 设计的细节.为客户记录正确的组件用法,并用编程的方式测试组件使用的顺应 性(compliance).在 AOP@Work 的最后一篇中,Dean Wampler 介绍 了 Contract4J,这是契约式设计的工具,它用 Java 5 标注 (annotation)指定合约,并在运行时用 AspectJ 方面计算合约.在成为 AOP 工具包中新增的一个举足轻重的工具的同时,Contract4J 迎合了面向方

基于Delphi的组件设计之概念

作为组件制作的开始,应该了解一些概念,我以为这些概念是非常重要的,将可以作为以后实践的理论基础. 一.组件的简要层次结构 一般情况下,VCL的组件可以从Tcomponent为开始.其最明显的特征就是它的属性可以在设计时通过对象察看器来操纵,另外,他还能拥有其他组件. 从Tcomponent下,分出非可视组件和可视组件. 非可视组件如TOPenDialog,TTimer,TTable等,这些组件因为继承自Tomponent,所以也就继承了在设计时可以被操纵的特性. 可视化组件始自TControl,

jQuery Mobile教程:grid组件设计实现细节

文章简介:本文我们来通过源码分析的方式,深度认识一下jQuery Mobile中grid组件的设计实现细节. 本文我们来通过源码分析的方式,深度认识一下jQuery Mobile中grid组件的设计实现细节 先看一下jquery.mobile-1.1.0.css的样式设计源码: /*grid的class*/ .ui-grid-a,.ui-grid-b,.ui-grid-c,ui-grid-d{ overflow:hidden; } /*block的class*/ .ui-block-a,.ui-

以增加收藏夹功能为实例,解析asp.net forums2结构流程及组件设计

asp.net|设计 td id="1" class="ControlPanelTabInactive" align="center" nowrap>            <a href="<%=Globals.GetSiteUrls().MyFavorites%>"><%=ResourceManager.GetString("MyFavorites_Title")%&

ASP.NET组件设计Step by Step(3)

asp.net|设计 自定义控件(custom control)入门 在服务器端中执行程序逻辑的组件,是asp.net 应用程序的基本构造块.为了能够在asp.net环境执行,必须满足一定条件. 为了能够参与到网页框架执行,需要满足IComponent, IDisposable, IParserAccessor, IdataBindingsAccessor等接口.所以框架提供System.Web.Control类供控件开发者继承. IComponent 提供组件所需的基本功能,接口实现为: {