持久性

控件可实现多个持久化接口中的一个或多个,以支持其状态的持久性化。 例如,IPersistStreamInit 接口支持基于流的持久性控件状态。 IPersistStreamInitIPersistStream 的替代项,增加了初始化方法 InitNew。 这两个接口中的其他方法都相同。 IPersistStreamInit 不派生自 IPersistStream;一个对象仅支持两个接口中的一个,具体取决于它是否需要能够初始化其新实例。

控件可以提供的其他持久接口包括:IPersistStorageIPersistMemoryIPersistPropertyBagIPersistMoniker。 控件实现者必须确定哪种持久性最重要,并实现相应的持久性接口。 控件实现程序还决定要保存的内容。 例如,控件可以在其容器中保存其属性的当前值或其位置和大小。 客户端将决定使用哪个接口。

在从其持久性状态加载控件之前,客户端可以检查 OLEMISC_SETCLIENTSITEFIRST 标志,以确定控件是否支持在加载其持久状态之前获取其客户端站点和环境属性。 此优化可以在实例化控件时节省时间,因为控件随后可以随意忽略其永久值,而不是只是为了被客户端提供的环境属性重写而加载它们。

控件还可以支持在 OLE 属性集(一组采用指定格式的标识符和值)中保存和还原其状态。 此功能对于 Visual Basic 等以文本形式保存其程序的容器非常有用。 想要支持此功能的控件实现 IDataObject::GetDataIDataObject::SetData,以便分别将其属性值传入和传出容器。 容器的工作就是将此信息转换为文本并保存。 控件使用的标识符对应控件的属性名称和值。 有关此属性集的定义,请参阅 OLE CDK。

ActiveX 控件