自己动手编写一个VS插件(三)——创建工具栏之一
作者:朱金灿
来源:http://blog.csdn.net/clever101
让我们继续开发一个VS插件。上次我们谈论了OnConnection函数,这次我们实现如何在插件中创建一个工具栏。
首先我们要弄明白VS是如何找到我们所建的插件的。VS插件本质上是一个com组件,其信息保存在注册表里。因此VS也是通过注册表来找到VS插件的。那个VS插件的信息保存在注册表的哪个位置呢?通过分析一些开源插件的源码(主要是分析工程里的AddIn.rgs文件),我发现VS插件的信息主要保存在注册表的下面两个位置(以VS2008为例)中的一个:
HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\9.0\AddIns
或者
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\Addins
二者的区别是第一个是当前用户才能使用,第二个是这个机器上所有用户都能使用。
之前我们提到插件的信息都保存在AddIn.rgs文件。那么我们分析一下这个AddIn.rgs到底保存了哪些信息?
下面是一个开源的插件工程的AddIn.rgs文件的内容:
HKCR
{
CppClean.Connect.1 = s \'Connect Class\'
{
CLSID = s \'{9672D81E-B893-483E-A503-6C1A67D4290A}\'
}
CppClean.Connect = s \'Connect Class\'
{
CLSID = s \'{9672D81E-B893-483E-A503-6C1A67D4290A}\'
CurVer = s \'CppClean.Connect.1\'
}
NoRemove CLSID
{
ForceRemove \'{9672D81E-B893-483E-A503-6C1A67D4290A}\' = s \'Connect Class\'
{
ProgID = s \'CppClean.Connect.1\'
VersionIndependentProgID = s \'CppClean.Connect\'
ForceRemove \'Programmable\'
InprocServer32 = s \'%MODULE%\'
{
val ThreadingModel = s \'Apartment\'
}
\'TypeLib\' = s \'{134021C0-52F7-46A0-ADC2-C6230CFA3A95}\'
}
}
}
HKCU
{
NoRemove \'SOFTWARE\'
{
NoRemove \'Microsoft\'
{
NoRemove \'VisualStudio\'
{
NoRemove \'9.0\'
{
NoRemove \'AddIns\'
{
ForceRemove \'CppClean.Connect\'
{
val LoadBehavior = d 0
val CommandLineSafe = d 0
val CommandPreload = d 0
val FriendlyName = s \'CppClean AddIn\'
val Description = s \'AddIn to pursue code high quality\'
val AboutBoxDetails = s \'Any question about CppClean, mailto:\r\noeichenwei@gmail.com\r\nCopyright (c) 2010 Wilson Chen.\'
val AboutBoxIcon = s \'%MODULE%,1\'
val SatelliteDllName = s \'CppCleanUI.dll\'
val SatelliteDllPath = s \'%MODULE_PATH%\'
}
}
}
}
}
}
}
初看之下这个rgs文件的内容是杂乱无章的,但是我们仔细分析一下发现还是有章可循的。这个rgs文件的内容大致可以分为两部分:HKCR和HKCU。我们可以看到HKCR部分不过是一般组件的注册信息(这个写过COM组件的同学都知道)。我们重点看看HKCU部分。我们看到HKCU部分的信息保存在HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\9.0\AddIns下面,那么结合注册表(下图),我们可以直观地看到它不过是定义了一些注册表项:
这些注册表项大部分我们都可以通过搜索网上的资料得到其真实含义:
LoadBehavior —— 加载行为,联系到上篇我们可以猜到它是在保存加载设置,是VS启动时加载还是单击其按钮时加载
FriendlyName:可选的,为Add-In指定一个有意义的名称;
Description:可选的,为Add-In指定有意义的描述信息;
AboutBoxDetails:都是可选的,如果要在About对话框中显示Add-In的话,该节点用于指定其详细信息和图标;
LoadBehavior:可选的,指定VS加载Add-In的方式,0表示VS不会自动加载,必须手工加载;1表示Add-in在VS启动的时候加载;4表示通过命令行方式加载;
CommandPreload:可选的,指定Add-In应当预先加载;
CommandLineSafe:可选的,指定Add-In是否是命令行安全的以及是否显示用户界面。
SatelliteDllName和SatelliteDllPath这两个注册表项的含义我们下一篇介绍。这篇到此为止。
参考文献:
- HOWTO: Adding buttons, commandbars and toolbars to Visual Studio .NET from an add-in,Author:Carlos J. Quintero (Microsoft MVP)