以下技术详细信息可帮助你可靠地在 Visual Studio 中实现源代码管理插件。
内存管理问题
在大多数情况下,集成开发环境(IDE),即调用方、释放和分配内存。 源代码管理插件返回调用方分配的缓冲区中的字符串和其他项。 例外情况会在特定功能的描述中注明。
文件名数组
传递文件数组时,它不会作为连续的文件名数组传递。 它作为指向文件名的指针数组传递。 例如,在 SccGet 中,文件名由lpFileNames参数传递,其中lpFileNames实际上是指向 a.char **
lpFileNames[0] 是指向名字的指针, lpFileNames[1] 是指向第二个名称的指针,等等。
大型模型
所有指针都是 32 位,即使在 16 位作系统上也是如此。
完全限定的路径
如果文件名或目录指定为参数,则它们必须是完全限定的路径或 UNC 路径,且没有结束反斜杠。 如果这是基础源代码管理系统的要求,源代码管理插件负责将这些内容转换为相对路径。
指定已注册 DLL 的完全限定路径
IDE 不再从相对路径(例如 .\NewProvider.dll)加载 DLL。 必须指定 DLL 的完整路径(例如 ,C:\Providers\NewProvider.dll)。 此要求通过防止加载未经授权的或模拟的源代码管理 DLL 来增强 IDE 的安全性。
在安装源代码管理插件时,检查现有的 VSSCI 插件
计划安装源代码管理插件的用户可能已在计算机上安装现有的源代码管理插件。 所创建的插件的安装(安装程序)程序应确定是否有相关注册表项的现有值。 如果已设置这些密钥,则安装程序应询问用户是否将插件注册为默认源代码管理插件并替换已安装的插件。
错误代码和报告
SCC_OK版本控制函数的返回代码表示对所有文件的操作均已成功。 如果作失败,则预期返回遇到的最后一个错误代码。
报告规则是,如果 IDE 中发生错误,IDE 负责报告它。 如果源代码管理系统中发生错误,源代码管理插件负责报告错误。 例如,IDE 目前未选择任何文件,而此 文件已签出 ,插件将显示。
上下文结构
在调用 SccInitialize 期间,调用方传递 ppvContext 参数,这是对 void 的未初始化句柄。 源代码管理插件可以忽略此参数,也可以分配任何类型的结构,并将指向该结构的指针放入传递的指针中。 IDE 不了解此结构,但它会将指向此结构的指针传递到插件中的其他每个调用中。 这为插件提供了宝贵的上下文缓存信息,可用于维护在不使用全局变量的情况下跨函数调用保留的全局状态信息。 插件负责在调用 SccUninitialize 时释放结构。
如果插件在 SccInitialize(特别是在 lpSccCaps 参数中)中设置第SCC_CAP_REENTRANT位,则会使用多个上下文结构来跟踪正在管理的所有打开的项目。
Bitflags 和其他命令选项
对于每个命令(如 SccGet),IDE 可以指定许多更改命令行为的选项。
API 支持通过 fOptions 参数使 IDE 设置某些选项。 这些选项连同它们影响的命令,在 特定命令使用的 Bitflags 中有描述。 一般情况下,这些选项是用户不会提示的选项。
大多数用户可配置的设置选项不是以这种方式定义的,因为它们在源代码管理插件之间差异很大。因此,建议的机制是“ 高级 ”按钮。 例如,在 “获取 ”对话框中,IDE 仅显示它理解的信息,但如果插件具有此命令的选项,它也会显示 “高级 ”按钮。 当用户单击 “高级 ”按钮时,IDE 会调用 SccGetCommandOptions ,使源代码管理插件能够提示用户输入信息,例如 bitflags 或日期/时间。 插件在 SccGet 命令期间传回的结构中返回此信息。