VC++6.0 编写插件(图文并茂)
下午偶然注意到VC++6.0新建工程标签页下的DevStudio Add-in Wizard,没有接触过,看名字是给Developer
Studio开发插件,心生喜感,于是百度之,发生百度检索几乎找不到一篇完整的文字讲述这个wizard的使用,
所以在CSDN搜了搜,费尽周折下载了一个只有几行实际代码的demo,同时在MSDN提供的实例中看到了类似的
demo,研究了几个小时,基本理清了这种插件的编写过程,总结出来,以供大家交流。IDE插件的用处不言而喻
,大名鼎鼎的Bound Check和Visual Assist X都属于这类插件。但我刚刚接触,水平很有限,更多地是希望得
到有共同爱好的朋友的指教。
鉴于各种"手把手教你XXX"文体横行,我也来手把手一次吧。
我这里的环境是Visual C++ 6.0,相信其他Visual Studio版本的方法是大同小异的。
1. 创建工程。启动VC++,新建一个DevStudio Add-in Wizard工程,如图,比如我这里命名为Addin,确
定。

工程设置,这里填写你给插件的描述,这将在Visual Studio装载插件时在列表中显示。比如我写Addin by
Lusta。


上图中2个复选框最好都选上,第一个使工程有默认的按钮工具条,第二个使该工程默认重写了响应Developer
Studio事件的函数。确认。
2. 相关准备。进入工程,查看Class View,会发现它自动生成了这么几个类。

其中,CXXXApp的作用相当于其他一般工程类型中的App类,比如MFC中的CWinApp类,是整个可执行程序或者链
接库的启动类。
CCommands类负责完成从界面触发的操作,具体的细节我也讲不清楚,因为这里用到了COM组件,似乎。我不是
很了解,基本只是摸清了大概的框架。
CDSAddIn类,完成某些初始化工作。具体描述在MSDN中可以找到,MSDN中有关于插件开发的几篇文章。我没有
细看,主要得研究代码才懂。
ICommands,声明为interface ICommands : IDispatch{}; 我也看不懂了,interface ICommands不知道是属于
什么类或者什么组件,COM技术?但是我看懂了这其中的函数实际就是响应VC界面上插件工具条按钮点击的代码
实体。
Globals变量中有不少内容,但都属于Wizard生成,可以不管。
对了,我们还没有想好编写的这个插件得有些什么功能。这些决定了我们要在ICommands中写进一些什么函数。
比如,我经常用windows记事本来临时做一些大段代码的批量处理,替换,查找,要比VC自身提供的功能方便很
多,所以我们在这里给插件添加一个启动windows记事本的功能。
windows还有一些小工具也很实用,比如我的专业是遥感,所以经常是做图像处理,偶尔会用windows画图工具
来截取图片或者转换图像格式,所以也可以把启动MSPaint添加插件工具条按钮中。这些没必要细说,我这里还
添加了启动计算器的功能,因为Visual Studio调试并不提供手动计算的功能,比如你计算某幅位图的存储宽度
。另外,增加一个通过百度搜索某一关键字的功能,以及关于本插件的信息。
3.编写代码。使用向导,右击类视图中的ICommands,点击Add Method,似乎这里都是叫方法,不叫函数。注意
:ICommands中已经默认生成了一个叫做AddinCommandMethod的方法,你可以删除它,也可以重写它做自己的事
。Add Method对话框如下:

填写名称,参数列表,下面的声明可以不修改,其中的id[X]代表该方法的ID,这个ID标识了该方法与插件工具
条按钮的顺序,比如id[6]的方法,响应第6个按钮的点击。
我在这里添加了4个方法,分别是:

注意第一个是自动生成的。然后我们可以在类视图中看到ICommands下出现了一共5个方法。

接下来要做的是,在工具条中插入这么多个按钮,并设置好按钮的图形(BMP位图)。在类视图中点开CDSAddin
类的OnConnection(),这是一个插件连接时的初始化过程。
在这里我们可以看到之前默认生成的AddinCommandMethod方法,它是如何与第一个按钮关联起来的。代码如下
:

我尝试了半天,参考demo,才知道了按钮与方法的关联都是这样一个一个完成的。唯一不同的是,要做这样几
个对应的修改(依次对应图中红框)。
A: 修改为对应方法的名字(我也不知道这里的区别在哪)
B: 修改为事先创建好的字符串资源ID,下面会详细介绍。
C: 修改为对应的方法名。
D: 这个数字的参数名是nBitmapOffset,意思是按钮位图上的偏移值(如果你熟悉MFC工具条的位图就能明白,
加载工具条是自动把位图的某一段分割为一个按钮)。
Windows提供的demo中,是用{ }把两段这样的代码分别圈起来的,形成了不同的作用域,这样就免去了声明不
同命局部变量的麻烦。这样我们就只需把这个{}包括其中的内容拷贝,粘贴4次,然后修改里面的相应参数即可
。
这里需要注意两点。一是nBitmapOffset这个参数,要根据你所绘制的工具条位图的顺序来对应方法的顺序。比
如第一个按钮的nBitmapOffset = 0,第二个按钮的nBitmapOffset = 1,琢磨琢磨你就懂了。这里我也是调试
了老半天才发现的。MSDN上没有任何说明,网上更找不到了。
我的理解是:方法与按钮的关联唯一地由这个参数决定。不管我有没有理解错,你可别弄混了就是。
接下来详细说说上面代码中的IDS_CMD_STRING1字符串资源的格式。如下图:

Caption由/n分为3个部分,第一部分是什么我没有发现,第二部分是光标移到插件按钮上时状态栏提示,第三
部分是光标提示。这里似乎如果格式错误的话就会导致按钮加载失败。得好好注意。
最后就是完成方法的具体实现。这里已经没有什么需要说的了,都是一般函数的编写一样。比如这里我这么测
试一下:

弹一个框,显示notepad。其他类似。如果需要完成功能的话当然easy了,用ShellExecute()或者别的都行。至
于搜索文本,MSDN的SAMPLE中有一个API查询的例子,里面用到了获取选定文本的方法,这里不细述,获取选定
文本后我们只需构建出这么一个东西http://www.baidu.com/s?wd=XXXXX就行了。然后ShellExecute。
至于位图按钮,就得自己画或者编辑了,分为2个,一个是32×32,5个按钮就是160×32,另一个是中等尺寸,
16×16,5个按钮就是80×16。我这里是用Photoshop画的,比较麻烦。
最后我们看看最终效果。
我们把编译好的Addin.dll拷贝到VC++安装目录下面的addin目录中,比如我的Visual C++6.0安装在D:/盘,所
以我可以打开D:/Program Files/Microsoft Visual Studio/Common/MSDev98/AddIns,粘贴到这里,而后在
VC++中点击tools->customize,在customize对话框中点选Add-ins and Macro files标签页,如果没错的话应
该看到列表中有Addin by Lusta。勾选,close。如果有什么问题的话,VC++会提示无法装载,问题在哪就得自
己找了。

图中Toolbar8就是我刚刚加载的插件,旁边是Visual Assist X的工具条。可以看到光标提示"Notepad"。我
们点击它,可以看到弹框。

说明插件已经成功注入了VC++主程序。我们的编写到此结束。
关于插件的卸载,需要强调的是,应该先重复tools->customize操作,将勾去掉,close。最后删除拷贝的dll
文件。如果直接删除的话注册表里面有残余。
好了,到这里为止。我只是凭借记忆总结了一下一般的编写过程。有什么不妥的不对的地方欢迎指正。文字描
述有点麻烦,可能存在讲不清楚的地方,如果有需要这个代码的,可以联系我。
联系方式
QQ: 137571735 现在叫日天昊...
EMAIL: lusta@live.cn
http://blog.sina.com.cn/s/blog_a401a1ea01014tdb.html
VC++6.0 编写插件(图文并茂)的更多相关文章
- 自己编写的基于VC++6.0的串口调试软件,并贡献源程序!
自己编写的基于VC++6.0的串口调试软件源程序! 程序下载链接: 点击打开链接
- VC++6.0和VS2005在编写MFC应用程序时,操作方面的差异
VC++6.0和VS2005在编写MFC应用程序时,操作方面的差异 一直用VC++6.0,对VS2005不太了解,下面简单的熟悉一下VS2005的一下功能,总结一下VS2005在编写MFC时候的应用. ...
- VC++6.0 配置CppUTest测试环境
最近看<软件项目成功之道>,书中无数次提及到“单元测试”对于项目成败的重要性,看到同事将CppUTest用于Linux动态库测试,于是在VC++6.0环境下搭建一个基于CppUTest的单 ...
- VC++6.0一些常见问题解决方法(打开多个窗口、行号、添加文件无响应、更改.exe图标及名称等等)
背景: 最近使用VC++6.0做一个界面,供测试CAN通信使用.由于客户希望我们提供简单方便的函数接口让其最快速使用CAN,DLL(动态链接库)是不二之选.做DLL需要两个VC窗口进行测试才方便.可是 ...
- 再谈:jquery编写插件的方法
版权声明:作者原创,转载请注明出处! 编写插件的两种方式: 1.类级别开发插件(1%) 2.对象级别开发(99%) 类级别的静态开发就是给jquery添加静态方法,三种方式 1.添加新的全局函数 2. ...
- 《VC++ 6简明教程》即VC++ 6.0入门精讲 学习进度及笔记
VC++6.0入门→精讲 2013.06.09,目前,每一章的“自测题”和“小结”三个板块还没有看(备注:第一章的“实验”已经看完). 2013.06.16 第三章的“实验”.“自测题”.“小结”和“ ...
- C语言学习_从VC++6.0开始
前言: C语言是一门博大精深的语言,C语言往往是程序员以及所有软件行业从业者的第一门编程语言. 编程环境: 对于初学者来说,我一开始学习C语言,其实是用的turboc 2.0版本,这个很有历史感,但是 ...
- jquery编写插件
jquery编写插件的方法 版权声明:作者原创,转载请注明出处! 编写插件的两种方式: 1.类级别开发插件(1%) 2.对象级别开发(99%) 类级别的静态开发就是给jquery添加静态方法,三 ...
- VC-关于VC++ 6.0的那些事儿
Microsoft Visual C++,(简称Visual C++.MSVC.VC++或VC)微软公司的C++开发工具,具有集成开发环境,可提供编辑C语言,C++以及C++/CLI等编程语言.VC+ ...
随机推荐
- java List排序方法 Comparator和Comparable
今天写的一个程序中需要对一个List进行排序,突然发现自己对这个问题一无所知,于是查阅资料并进行测试,在此做个记录. Collections工具类中有两个方法可以对List进行排序,分别为: publ ...
- Linux下rsync增加SSH端口号的用法
rsync默认使用SSH的22号端口,为了安全起见,很多机器更改了SSH默认的端口号,对应rsync命令的用法为: rsync -e 'ssh -p 1234' username@hostname:S ...
- day-7
/* 倒数7天了 某一天 某一刻 某次呼吸 我们终将再分离 而我的 自传里 曾经有你 没有遗憾的诗句 诗句里 充满感激 (小仙女博客抄来的233) 是啊 就快要结束了 曲终人散 上午被错误数据卡了一小 ...
- [配置文件] C#修改App.config,Web.config文件帮助类,ConfigHelper (转载)
点击下载 ConfigHelper-sufei.rar 主要功能如下 .根据Key取Value值 .根据Key修改Value .添加新的Key ,Value键值对 .根据Key删除项 /// < ...
- 修改tomcat默认的端口号
协同管理系统黙认使用Tomcat默认的端口8080,除8080端口外Tomcat还会占用8005,8009和8443端口.如果这4个端口已被占用,可以将协同管理系统修改为使用其它端口. 修改方法如下: ...
- OC基础-day05
#pragma mark - Day05_01_NSObject类 NSObject类 1). NSObject是Foundation框架中的1个类. 在这个类中有1个类方法,叫做new 这个方法的作 ...
- iOS与服务器端 GZip压缩问题
昨天搞了一天的GZip压缩,试了三种方式(libz库,ZipArchive,ASIHttpRequest),一开始都不成功.理论上三个应该都能用的,但我都不行.等我试到第三种方式的时候才知道,不是我的 ...
- EA UML 建模——类图
Enterprise Architect(EA) 是一个功能比较强悍的建模工具,本篇文章仅使用其 UML 建模功能,其他更多功能,可以Google. 一.简单梳理C#中类与类.类与接口.接口与接口的关 ...
- gulp分享文档
Grunt--I/O操作: 读取A → A.a() → 写出A → 读取A → A.b() → 写出A; gulp--数据流:读取A → A.a() → A.b() → 写出A. Part① 构建gu ...
- Open judge 07和为给定数
总时间限制: 1000ms 内存限制: 65536kB 传送门 类似的题传送门 描述 给出若干个整数,询问其中是否有一对数的和等于给定的数. 输入 共三行: 第一行是整数n(0 < n < ...