持久性接口
具有任何类型的持久状态的对象必须至少实现一个 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之外,每个接口的所有方法都必须完全实现。