文档锁持有者管理
正在运行的文档表 (RDT) 维护打开的文档计数及其具有的任何编辑锁。 当在后台以编程方式编辑文档时,可以在 RDT 中放置编辑锁,而无需用户在文档窗口中看到打开的文档。 设计器通常使用此功能,这些设计器通过图形用户界面修改多个文件。
文档锁持有者方案
文件“a”依赖于文件“b”
请考虑以下情况:为文件类型“a”实现标准编辑器“A”,并且“a”类型的每个文件都引用了类型为“b”的文件(或依赖)。 类型为“b”的文件存在标准编辑器“B”。 当编辑器“A”打开文件“a”时,它将检索对相应文件“b”的引用。 文件“b”未显示,但编辑器“A”可以修改它。 编辑器“A”从 FindAndLockDocument 方法中获取对文件“b”的文档数据的引用,并维护对文件“b”的编辑锁定。 编辑器“A”完成修改文件“b”后,可以通过调用 UnlockDocument 该方法来递减文件“b”上的编辑锁计数。 如果调用FindAndLockDocument了参数设置为_VSRDTFLAGS的方法dwRDTLockType
,则可以省略此步骤。RDT_NoLock。
文件“b”由其他编辑器打开
如果编辑器“A”尝试打开该文件时编辑器“B”已打开文件“b”,则有两个单独的方案可以处理:
如果文件“b”在兼容的编辑器中打开,则必须使用 RegisterDocumentLockHolder 该方法在文件“b”上注册文档编辑锁“A”。 编辑器“A”完成文件“b”修改后,使用 UnregisterDocumentLockHolder 该方法取消注册文档编辑锁。
如果文件“b”以不兼容的方式打开,则可以让编辑器“A”尝试打开文件“b”失败,或者允许与编辑器“A”部分打开的视图并显示相应的错误消息。 错误消息应指示用户在不兼容的编辑器中关闭文件“b”,然后使用编辑器“A”重新打开文件“a”。 还可以实现 Visual Studio SDK 方法 QueryCloseRunningDocument ,以提示用户关闭在不兼容的编辑器中打开的文件“b”。 如果用户关闭文件“b”,编辑器“A”中的文件“a”的打开将正常继续。
其他文档编辑锁定注意事项
如果编辑器“A”是唯一在文件“b”上具有文档编辑锁的编辑器,则会出现不同的行为,而编辑器“B”也持有文件“b”上的文档编辑锁。 在 Visual Studio 中, 类设计器 是视觉设计器的一个示例,它不持有关联代码文件的编辑锁。 也就是说,如果用户在设计视图中打开了类图,并且关联的代码文件同时打开,并且如果用户修改了代码文件但不保存更改,则类图 (.cd) 文件也会丢失更改。 如果类设计器对代码文件具有唯一的文档编辑锁,则关闭代码文件时,不会要求用户保存更改。 IDE 要求用户仅在用户关闭 类设计器后保存更改。 保存的更改反映在这两个文件中。 如果类设计器和代码文件编辑器都持有代码文件上的文档编辑锁,则在关闭代码文件或表单时,系统会提示用户保存。 此时,保存的更改将同时反映在窗体和代码文件中。 有关类图的详细信息,请参阅“使用类图”(类设计器)。
请注意,如果需要将编辑锁放在非编辑器的文档上,则必须实现 IVsDocumentLockHolder 该接口。
多次以编程方式修改代码文件的 UI 设计器对多个文件进行更改。 在这种情况下,SaveItemsViaDlg该方法通过是否保存对以下项的更改来处理一个或多个文档的保存?