自己动手编写一个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 0val CommandLineSafe = d 0val CommandPreload = d 0val 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)
- Visual Studio 2008 可扩展性开发(三):Add-In运行机制解析(上)
转载于:https://www.cnblogs.com/lanzhi/archive/2013/04/10/6470586.html
自己动手编写一个VS插件(三)——创建工具栏之一相关推荐
- 自己动手编写一个VS插件 一
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 作者:朱 ...
- 自己动手编写一个VS插件(六)
作者:朱金灿 来源:http://blog.csdn.net/clever101 在上篇中我们已经实现了创建和显示一个工具栏出来,它的效果图是这样的: 现在我们实现一些简单功能,具体就是单击按钮弹出一 ...
- 编写一个VSCode插件
原文链接: 编写一个VSCode插件 - 愧怍的小站 自从使用过 VSCode 后就再也离不开 VSCode,其轻量的代码编辑器与诸多插件让多数开发者爱不释手.同样我也不例外,一年前的我甚至还特意买本 ...
- 从零开始编写一个vue插件
title: 从零开始编写一个vue插件 toc: true date: 2018-12-17 10:54:29 categories: Web tags: vue mathjax 写毕设的时候需要一 ...
- 如何编写一个Jquery插件
首先我们来搞清楚一些关于Jquery插件的知识: 一.插件的种类: 封装对象方法的插件 这种插件是将对象方法封装起来,用于对通过选择器获取的jQuery对象进行操作,是最常见的一种插件 封装全局函数的 ...
- java插件开发_编写一个IDEA插件之:自动生成Java代码
我很喜欢IDEA的一键自动生成代码功能,例如自动生成构造方法.字段的Get/Set方法.ToString方法等等,除此之外,也有一些插件提供自动生成代码的功能,例如我们所熟悉的GsonFormat插件 ...
- linux的静态编译elf无法调试,[翻译]自己动手编写一个Linux调试器系列之4 ELF文件格式与DWARF调试格式 by lantie@15PB...
自己动手编写一个Linux调试器系列之4 ELF文件格式与DWARF调试格式 by lantie@15PB 在上一节中,你已经听说了DWARF调试格式,它是程序的调试信息,是一种可以更好理解源码的方式 ...
- 怎么编写一个chrome插件
怎么编写一个chrome插件 总觉得chrome插件这种东西很高端,很遥不可及.当然复杂的chrome插件开发起来确实比较困难,但是我们可以从一个简单的chrome插件demo慢慢入手,了解一下chr ...
- 编写一个IDEA插件之:事件监听
事件监听,我们最熟悉不过的就是开发APP时,监听按钮点击事件.手指触摸及移动事件.网络状态事件等等.事件监听大多通过观察者模式实现,首先API调用者不需要知道后台是如何检测出网络状态不可用的,而只需要 ...
- C语言——选择控制结构 寻找中位数v1.0编写一个函数返回三个整数中的中间数。函数原型:int mid(int a, int b, int c);功能是返回a,b,c三数中大小位于中间的一个数。
寻找中位数v1.0 编写一个函数返回三个整数中的中间数. 函数原型:int mid(int a, int b, int c); 功能是返回a,b,c三数中大小位于中间的一个数. 程序运行结果示例1: ...
最新文章
- Spring越来越强,而我们越来越快餐!离开了Spring,居然API都写不出来了! 程序猿DD...
- 五十五张图告诉你微服务的灵魂摆渡者Nacos究竟有多强?
- 从零开始学python数据分析-从零开始学Python数据分析与挖掘 PDF 扫描版
- spring websocket Converters must not be empty
- pycharm 提示 ennble Code compatibility inspection(代码兼容性检查)
- mysql 1100_mysql数据库选择,有1100个用户,每个用户每月生成一张表,使用中该表内每秒上传一条数据,数据量很大...
- windows下的_mkdir函数
- angular js 默认选中_AngularJS Select(选择框)
- GCF(2)---GCF中LAUNCH BROWSER测项注意事项
- flume avro java_flume之Avro Source和Avro Sink
- 网络对抗技术——密码破解技术
- 网页制作初期,必须的东西
- 【Caffe代码解析】Blob
- AE Pixel Sorter 2 for Mac破解教程
- 基于WebService实现设备状态监控Demo(含源码)
- 前端如何还原设计稿?
- 云空间为您提供10G免费全能空间
- vue实践学习——keep-alive属性及生命周期
- 2.【OS】vscode下载很慢的问题
- VBA操作WORD(四):获知关键字所在段落及相关信息
热门文章
- PHP内存溢出:Allowed memory size of 536870912 bytes exhausted (tried to allocate 20480 bytes)
- PHP两个二维数组数据处理:字段值相等,则赋值给另一个数组
- PHPExcel存放多个sheet报错:Invalid character found in sheet title
- OFFICE技术讲座:JDK绘制旋转斜体字体的效果
- 2021-11-17
- 全网首发:ScrollBarUI混淆后效果错误的分析
- 热烈祝贺人生第一篇论文发表成功
- LINUX没有SVN,怎么知道哪些文件修改了
- 发现新的预言梦种类:预言梦投射
- doubango安卓端的帧率太低,解决办法