确定哪个编辑器在项目中打开文件

当用户在项目中打开文件时,环境将经历轮询过程,最终打开该文件的相应编辑器或设计器。 环境使用的初始过程对于标准和自定义编辑器都是相同的。 在轮询用于打开文件的编辑器时,环境使用各种条件,VSPackage 在此过程中必须与环境协调。

例如,当用户“文件”菜单中选择“打开”命令,然后选择 filename.rtf(或使用 .rtf 扩展名的任何其他文件),环境将调用IsDocumentInProject每个项目的实现,最终循环访问解决方案中的所有项目实例。 项目返回一组标志,用于按优先级标识文档上的声明。 环境使用最高优先级调用相应的 OpenItem 方法。 有关轮询过程的详细信息,请参阅 “添加项目和项目项模板”。

杂项文件项目声明其他项目未声明的所有文件。 这样,自定义编辑器就可以在标准编辑器打开文档之前打开文档。 如果杂项文件项目声明文件,环境将调用 OpenStandardEditor 该方法以使用标准编辑器打开该文件。 环境检查处理 .rtf 文件的已注册编辑器的内部列表。 此列表位于注册表中的以下键:

HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\<version>\Editors\<editor factory guid>\Extensions

环境还检查具有子项 DocObject 的任何对象的 HKEY_CLAS标准版S_ROOT\CLSID 键中的类标识符。 如果找到文件扩展名,则会在 Visual Studio 中就地创建应用程序的嵌入版本(如 Microsoft Word)。 这些文档对象必须是实现接口的 IPersistStorage 复合文件,或者该对象必须实现 IPersistFileFormat 接口。

如果注册表中没有 .rtf 文件的编辑器工厂,则环境将在 HKEY_CLAS标准版S_ROOT\.rtf 键中查找,并打开其中指定的编辑器。 如果在HKEY_CLAS标准版S_ROOT找不到文件扩展名,则环境将使用 Visual Studio 核心文本编辑器打开该文件(如果是文本文件)。

如果核心文本编辑器失败,如果文件不是文本文件,则环境会将其二进制编辑器用于该文件。

如果环境在其注册表中找到 .rtf 扩展的编辑器,它将加载实现此编辑器工厂的 VSPackage。 环境在 SetSite 新的 VSPackage 上调用该方法。 VSPackage 使用QueryServiceSID_SVsRegistorEditorRegisterEditor该方法向环境注册编辑器工厂,调用它。

环境现在重新检查其已注册编辑器的内部列表,以查找新注册的 .rtf 文件的编辑器工厂。 环境调用方法的 CreateEditorInstance 实现,传入要创建的文件名和视图类型。