实现源代码管理插件的最佳做法

以下技术详细信息可帮助你可靠地在 Visual Studio 中实现源代码管理插件。

内存管理问题

在大多数情况下,集成开发环境(IDE),即调用方、释放和分配内存。 源代码管理插件返回调用方分配的缓冲区中的字符串和其他项。 异常在发生特定函数的说明中指出。

文件名数组

传递文件数组时,它不会作为连续的文件名数组传递。 它作为指向文件名的指针数组传递。 例如,在 SccGet 中,文件名由lpFileNames参数传递,其中lpFileNames实际上是指向 a.char ** lpFileNames[0] 是指向名字的指针, lpFileNames[1] 是指向第二个名称的指针,等等。

大型模型

所有指针都是 32 位,即使在 16 位操作系统上也是如此。

完全限定的路径

如果文件名或目录指定为参数,则它们必须是完全限定的路径或 UNC 路径,且没有结束反斜杠。 如果这是基础源代码管理系统的要求,源代码管理插件负责将这些内容转换为相对路径。

指定已注册 DLL 的完全限定路径

IDE 不再从相对路径加载 DLL(例如 .\NewProvider.dll)。 必须指定 DLL 的完整路径(例如 C:\Providers\NewProvider.dll)。 此要求通过防止加载未经授权的或模拟的源代码管理 DLL 来增强 IDE 的安全性。

安装源代码管理插件时检查现有 VSSCI 插件

计划安装源代码管理插件的用户可能已在计算机上安装现有的源代码管理插件。 所创建的插件的安装(安装程序)程序应确定是否有相关注册表项的现有值。 如果已设置这些密钥,则安装程序应询问用户是否将插件注册为默认源代码管理插件并替换已安装的插件。

错误代码和报告

SCC_OK源代码管理函数的返回代码指示所有文件的操作已成功。 如果操作失败,则预期返回遇到的最后一个错误代码。

报告规则是,如果 IDE 中发生错误,IDE 负责报告它。 如果源代码管理系统中发生错误,源代码管理插件负责报告错误。 例如,IDE 当前不会报告任何文件,而此文件已检查由插件报告。

上下文结构

在调用 SccInitialize 期间,调用方传递 ppvContext 参数,这是对 void 的未初始化句柄。 源代码管理插件可以忽略此参数,也可以分配任何类型的结构,并将指向该结构的指针放入传递的指针中。 IDE 不了解此结构,但它会将指向此结构的指针传递到插件中的其他每个调用中。 这为插件提供了宝贵的上下文缓存信息,可用于维护在不使用全局变量的情况下跨函数调用保留的全局状态信息。 插件负责在调用 SccUninitialize 时释放结构。

如果插件设置 SCC_CAP_REENTRANT SccInitialize 中的位(具体而言,在lpSccCaps参数中),则使用多个上下文结构跟踪所有打开的项目。

Bitflags 和其他命令选项

对于每个命令(如 SccGet),IDE 可以指定许多更改命令行为的选项。

该 API 通过参数支持 IDE fOptions 设置某些选项。 这些选项在 特定命令 使用的 Bitflags 以及它们受影响的命令中使用。 一般情况下,这些选项是用户不会提示的选项。

大多数用户可配置的设置选项不是以这种方式定义的,因为它们在源代码管理插件之间差异很大。因此,建议的机制是“ 高级 ”按钮。 例如,在 “获取 ”对话框中,IDE 仅显示它理解的信息,但如果插件具有此命令的选项,它也会显示“ 高级 ”按钮。 当用户单击“ 高级 ”按钮时,IDE 会调用 SccGetCommandOptions ,使源代码管理插件能够提示用户输入信息,例如 bitflags 或日期/时间。 插件在命令期间 SccGet 传回的结构中返回此信息。