坚持
控件实现一个或多个多个持久性接口以支持其状态的持久性。 例如,IPersistStreamInit 接口支持控件状态的基于流的持久性。 IPersistStreamInit 替代 IPersistStream,并添加了初始化方法,InitNew。 这两个接口中的其他方法都是相同的。 IPersistStreamInit 不派生自 IPersistStream;对象仅支持两个接口中的一个,具体取决于它是否需要初始化自身的新实例。
控件可以提供的其他持久性接口包括:IPersistStorage、IPersistMemory、IPersistPropertyBag、IPersistMoniker。 控件实现者必须决定哪种类型的持久性最重要的并实现适当的持久性接口。 控件实现者还决定要保存的内容。 例如,控件可以保存其属性的当前值或其容器中的位置和大小。 客户端决定它喜欢使用的接口。
在从其持久性状态加载控件之前,客户端可以检查OLEMISC_SETCLIENTSITEFIRST标志,以确定控件是否支持在加载其持久性状态之前获取其客户端站点和环境属性。 当实例化控件时,此优化可以节省时间,因为控件随后可以自由地忽略其持久值,而不是加载它们,使其仅由客户端提供的环境属性重写。
控件还可以支持在 OLE 属性集中保存和还原其状态、一组采用指定格式的标识符和值。 此功能对于 Visual Basic 等容器非常有用,这些容器以文本形式保存其程序。 想要支持此功能的控件实现 IDataObject::GetData 和 IDataObject::SetData 分别向其传入和传出容器的属性值。 它是容器的作业,用于将此信息转换为文本并保存它。 控件使用的标识符对应于控件的属性名称和值。 有关此属性集的定义,请参阅 OLE CDK。
相关主题