嵌入对象

【勇芳软件工作室】汉化HomePreviousNext

当协调文档时,公文包协调器本身可能会发现一个不能调和的类型的嵌入对象。在这种情况下,协调器需要递归调和每个嵌入对象并承担发起者的所有责任。

为了执行递归,公文包协调器加载对象并查询相应的接口。对象的处理程序必须支持该接口。如果接口的任何成员函数返回OLE_E_NOTRUNNING值,则调度器必须运行该对象才能执行该操作。因为嵌入式对象的代码并不总是可用,调和者必须为此条件提供解决方案。例如,对帐者可能包括已对帐版本中的嵌入对象的旧版本和新版本。调解者不得尝试跨链接进行协调。

启动器存储正在合并的文档版本。在许多情况下,启动器可以访问每个版本的存储,并使用类似的存储保存对帐结果。然而,有时候,启动器可能具有不具有持久版本的内存中对象。当包含打开的嵌入对象的文档在保存之前必须对帐时,可能会发生这种情况。在这种情况下,启动器将对帐结果保存在内存中找到的版本中。

启动器使用IPersistStorage接口绑定(加载)合并的版本。如果已经创建了初始版本,则启动器使用IPersistStorage::Load成员函数,并使用初始版本的IPersistStorage::InitNew成员函数。加载合并版本后,启动器使用QueryInterface检索IReconcilableObject接口的地址。该接口使发起者能够访问现有残留物的存储,并为其创建任何新残留物的存储。然后,启动器指示接口执行对帐。启动器在IPersistStorage之前实际查询IPersistFile接口。如果调解器支持IPersistFile,启动器将通过IPersistFile而不是IPersistStorage成员函数来操作副本。这样可以对不存储为复合文档的文件进行对帐。

协调完成后,启动器可以使用IPersistStorageIPersistFile界面保存合并的版本。在和解期间,公文包协调员根据需要创建残差,并将其持久位写入存储。如果合并的版本是流,则传递给IPersistStorage::LoadIStorage接口包含名为“Contents”的流,其存储状态设置为STATEBITS_FLAT。(您可以使用IStorage::Stat成员函数设置状态位。)合并后,启动器通过以适当的方式写入数据来保存合并的版本。它应该确保STATEBITS_FLAT根据存储设置。