作者:朱金燦
來源: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\[email protected]\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)