运行文档表

IDE 维护内部结构中所有当前打开的文档的列表,称为正在运行的文档表(RDT)。 此列表包括内存中所有打开的文档,无论这些文档当前是否正在编辑。 文档是保留的任何项,包括项目或主项目文件中的文件(例如 .vcxproj 文件)。

正在运行的文档表的元素

正在运行的文档表包含以下条目。

元素 说明
文档名字对象 唯一标识文档数据对象的字符串。 这将是管理文件的项目系统的绝对文件路径(例如 C:\MyProject\MyFile)。 此字符串还用于在文件系统以外的存储中保存的项目,例如数据库中的存储过程。 在这种情况下,项目系统可以发明一个唯一的字符串,它可以识别并可能分析以确定如何存储文档。
层次结构所有者 拥有文档的层次结构对象,由 IVsHierarchy 接口表示。
物品 ID 层次结构中特定项的项标识符。 此值在拥有此文档的层次结构中的所有文档中都是唯一的,但不能保证此值在不同的层次结构中是唯一的。
文档数据对象 至少,这是一个 IUnknown

对象。 IDE 不需要自定义编辑器的文档数据对象的接口以外的 IUnknown 任何特定接口。 但是,对于标准编辑器,需要编辑器的 IVsPersistDocData2 接口实现来处理项目中的文件持久性调用。 有关详细信息,请参阅 “保存标准文档”。
标记 当将条目添加到 RDT 时,可以指定用于控制文档是否保存、是否应用读取或编辑锁等的标志。 有关详细信息,请参见 _VSRDTFLAGS 枚举。
编辑锁定计数 编辑锁计数。 编辑锁指示某些编辑器已打开文档以供编辑。 当编辑锁计数转换为零时,系统会提示用户保存文档(如果已修改)。 例如,每次使用 “新建窗口” 命令在编辑器中打开文档时,RDT 中都会为该文档添加编辑锁。 若要设置编辑锁,文档必须具有层次结构或项 ID。
读取锁定计数 读取锁计数。 读取锁指示正在通过某些机制(如向导)读取文档。 读取锁在 RDT 中保持文档活动状态,同时指示无法编辑文档。 即使文档没有层次结构或项 ID,也可以设置读取锁。 此功能允许在内存中打开文档,并在 RDT 中输入文档,而无需任何层次结构拥有该文档。 此功能很少使用。
锁持有者 接口的 IVsDocumentLockHolder 实例。 锁持有者由编辑器外部打开和编辑文档的向导等功能实现。 锁持有者允许该功能向文档添加编辑锁,以防止文档在仍在编辑时关闭文档。 通常,编辑锁仅由文档窗口(即编辑器)添加。

RDT 中的每个条目都有一个与它关联的唯一层次结构或项 ID,这通常对应于项目中的一个节点。 所有可用于编辑的文档通常都归层次结构所有。 在 RDT 控件中做出的条目,或者更准确地控制哪个层次结构,当前拥有正在编辑的文档数据对象。 使用 RDT 中的信息,IDE 可以防止文档一次由多个项目打开。

层次结构还控制数据的持久性,并使用 RDT 中的信息更新“ 保存另存为 ”对话框。 当用户修改文档,然后从“文件”菜单中选择“退出”命令时,IDE 会提示他们使用“保存更改”对话框显示当前修改的所有项目和项目项。 这允许用户选择要保存的文档。 要保存的文档列表(即具有更改的文档)是从 RDT 生成的。 退出应用程序时,希望在退出应用程序时在“保存更改”对话框中看到的任何项都应在 RDT 中具有记录。 RDT 坐标要保存哪些文档,以及是否使用每个文档的 Flags 条目中指定的值提示用户进行保存操作。 有关 RDT 标志的详细信息,请参阅 _VSRDTFLAGS 枚举。

编辑锁和读取锁

编辑锁和读取锁驻留在 RDT 中。 文档窗口递增和递减编辑锁。 因此,当用户打开新的文档窗口时,编辑锁定计数递增一个。 当编辑锁数达到零时,将指示层次结构保留或保存关联文档的数据。 然后,层次结构可以以任何方式保留数据,包括作为文件保留或存储库中的项。 可以使用 LockDocument 接口中的 IVsRunningDocumentTable 方法添加编辑锁和读取锁,以及 UnlockDocument 删除这些锁的方法。

通常,实例化编辑器的文档窗口时,窗口框架会自动在 RDT 中添加文档的编辑锁。 但是,如果创建自定义视图,该视图不使用标准文档窗口(即,它不实现 IVsWindowFrame 界面),则需要设置自己的编辑锁。 例如,在向导中,文档在编辑时不会在编辑器中打开。 为了使文档锁由向导和类似的实体打开,这些实体必须实现 IVsDocumentLockHolder 该接口。 若要注册文档锁持有者,请调用该方法 RegisterDocumentLockHolder 并传入 IVsDocumentLockHolder 实现。 这样做会将文档锁持有者添加到 RDT。 实现文档锁持有者的另一种方案是通过特殊工具窗口打开文档。 在此实例中,无法让工具窗口关闭文档。 但是,通过在 RDT 中注册为文档锁持有者,IDE 可以调用方法的 CloseDocumentHolder 实现来提示关闭文档。

正在运行的文档表的其他用途

IDE 中的其他实体使用 RDT 获取有关文档的信息。 例如,源代码管理管理器使用 RDT 告诉系统在获取最新版本的文件后在编辑器中重新加载文档。 为此,源代码管理管理器会查找 RDT 中的文件,以查看其中是否有文件处于打开状态。 如果是,则源代码管理管理器首先检查,以查看层次结构是否实现该方法ReloadItem。 如果项目未实现ReloadItem该方法,则源代码管理管理器将直接检查文档数据对象上方法的ReloadDocData实现。

如果用户请求该文档,IDE 还使用 RDT 重新浮出水面(将打开的文档置于前面)。 有关详细信息,请参阅 使用“打开的文件”命令显示文件。 若要确定是否在 RDT 中打开文件,请执行下列操作之一。

  • 查询文档名字对象(即完整的文档路径),以确定该项是否已打开。

  • 使用层次结构或项 ID 向项目系统询问完整的文档路径,然后在 RDT 中查找项目。

另请参阅