持久接口
具有任何一种持久状态的对象必须至少实现一个 IPersist* 接口,最好是多个接口,以便为容器提供最灵活的选择,以想要的方式保存控件的状态。
如果控件具有任何持久状态,则必须至少实现 IPersistStream 或 IPersistStreamInit(两者互斥,大多数情况下不应一起实现)。 当控件希望知道何时新建而不是从现有持久状态重新加载时将使用后者(IPersistStream 没有新建功能)。 任一接口的存在表明控件可以保存其持久状态并将其加载到流中,即 IStream 实例。
除了这两个基于流的接口以外,还可以选择下表中列出的 IPersist* 接口,以支持可扩展 IStream 以外位置的持久性。
标识一组组件类别,用于涵盖对持久性接口的支持,请参阅组件类别。
接口 | 使用情况 |
---|---|
IPersistMemory |
该对象可以保存其状态并将其加载到固定长度的顺序字节数组(内存中)。 |
IPersistStorage |
该对象可以保存状态并将其加载到 IStorage 实例中。 希望标记为可作为其他复合文档对象插入的控件(用于插入非控件感知容器)必须支持此接口。 |
IPersistPropertyBag |
该对象可以保存状态并将其加载为容器实现的写入 IPropertyBag 的单个属性。 这用于某些容器中的“另存为文本”功能。 |
IPersistMoniker |
该对象可以保存状态并将其加载到名字对象命名的位置。 该控件调用 IMoniker::BindToStorage 以检索所需的存储接口,例如 IStorage、IStream、ILockBytes、IDataObject 等。 |
虽然对 IPersistPropertyBag 的支持可选,但强烈建议使用“另存为文本”功能对容器进行优化(如 Visual Basic)。
除了 IPersistStream::GetSizeMax、IPersistStreamInit::GetSizeMax 和 IPersistMemory::GetSizeMax 之外,每个接口的所有方法都必须完全实现。