使用VC++ ATL实现iStylePDF的COM插件
2014-08-11 14:23
225 查看
本文介绍了一种使用VC++ ATL(Active TemplateLibrary),利用ISPExtensibility接口,为 iStylePDF 加入功能简单的COM插件(addin),加入工具栏按钮等可视部件,并为其加入响应事件的方法。我们采用VS2010为iStylePDF平台开发插件,当然也可以使用其他VS工具。开发插件的第一步需要安装iStylePDF的客户端,客户端程序中包括了ActiveX控件,这个是我们需要用到的类型库。如果没有客户端,请进入这里下载。下面开始逐步介绍开发步骤。
1、在visual C++编程环境下,利用向导生成一个名为PDFAddin的ATL COM Appwizard工程(图一):
![](http://s3.51cto.com/wyfs02/M02/45/7A/wKioL1PoYcOic7wyAAJyPHgE6UE942.jpg)
在向导的设置中采用默认设置,选择Next。然后单击Finish,这样一个空的ATL project就产生了(如图二)。
![](http://s3.51cto.com/wyfs02/M01/45/79/wKiom1PoYLzCzRqwAAHpmCCC640246.jpg)
2、插入一个ATL的简单对象: 选择菜单Project—>Add Class...,出现类向导对话框(如图三),单击Add:
![](http://s3.51cto.com/wyfs02/M02/45/79/wKiom1PoYMjS6g2tAALt_Is-NDA030.jpg)
输入简单对象类名称,如PDFReader。注意一点的地方是VS2010 ProgID自己填写,这个名字很重要,最后编译生成的文件名称必须用这个命名。示例所示为iStylePDF.PDFReader。最后编译的控件名称为iStylePDF.PDFReader.spi(如图四),单击Next。
![](http://s3.51cto.com/wyfs02/M01/45/7A/wKioL1PoYinT4BBVAAF_1kh3kd8897.jpg)
文件类型选项采用默认值。选项页的设置根据自己的需要是否设置连接点和ISupportErrorInfo支持,其他采用默认值即可。(如图五),单击完成。一个基本的COM组件就创建了,编译该工程看是否正常。现在该控件还没有和iStylePDF关联起来。接下来是重点设置。
![](http://s3.51cto.com/wyfs02/M02/45/79/wKiom1PoYR-ynOugAAGNyAIJtjs826.jpg)
3、在CPDFReader类中实现ISPExtensibility的接口:
ISPExtensibility是iStylePDF类型库中的一个虚接口类。插件程序的CPDFReader只要继承并实现该类的几个接口就能和宿主程序关联。添加继承虚接口类步骤如下,首先选择类视图,找到ATL的简单对象类,右键单击弹出菜单,选择Add->Implement Interface。如图六
![](http://s3.51cto.com/wyfs02/M00/45/79/wKiom1PoYSujjY7pAAJ3KFbpfV4161.jpg)
可用的类型库名称中选择iStylePDF ObjectLibrary<1.0>,如果类型库中没有,说明控件没有注册,也可以从文件选择iStylePDF.ocx。接口中选择ISPExtensibility,移动到右边的实现接口类中,单击完成。如图七。
![](http://s3.51cto.com/wyfs02/M00/45/7A/wKioL1PoYlDyu_EeAAHXoGaLM_k692.jpg)
现在就自动添加了ISPExtensibility接口类的接口函数,OnConnection,OnDisconnection主要使用这两个函数。修改输出文件名称,编译成功之后。即可放到iStylePDF安装目录的plugins目下,平台启动就会加载该插件。目前插件什么功能都没有实现,所以什么看不到,下面介绍添加一个工具条。
![](http://s3.51cto.com/wyfs02/M00/45/79/wKiom1PoYUPxvhvTAAIKCME329c738.jpg)
4、添加工具栏按钮: 添加工具栏按钮可以再程序连接的函数中实现。OnConnection参数是一个Application顶级对象,通过该对象可以获取所有的其他对象。请参考对象模型。我们定义一个变量把Application指针保存起来。
![](http://s3.51cto.com/wyfs02/M02/45/7A/wKioL1PoYmqxlMFtAABJN1bvSNE683.jpg)
OnConnection的实现如下代码:
![](http://s3.51cto.com/wyfs02/M00/45/7A/wKioL1PoYnWh5C-MAALMYESCnYc352.jpg)
CommandBar的函数说明请参考对象模型。编译运行工具栏就加进去了。如图九
![](http://s3.51cto.com/wyfs02/M02/45/79/wKiom1PoYWjAUybUAABy4GkXDjs130.jpg)
5、按钮事件的添加: 按钮添加了,需要接收按钮的事件,下面就是要介绍实现Event的响应。ATL为COM对象的Idispatch接口提供了两个模板类:IDispEventImpl<>和IDispEventSimpleImpl<>,选择IDispEventSimpleImpl<>,因为它不需要额外的类型库信息,从IDispEventSimpleImpl<>继承一个类:
![](http://s3.51cto.com/wyfs02/M00/45/79/wKiom1PoYXLC5_HLAABXp9bFKiw718.jpg)
然后再添加事件映射宏即可接收事件。BEGIN_SINK_MAP(CPDFReader) END_SINK_MAP()
接下来我们要做的是为按钮加单击事件。首先要用_ATL_SINK_INFO结构描述回调的参数信息,必须声明为外部变量,我们为事件预定义了一些参数说明,如下:
![](http://s3.51cto.com/wyfs02/M01/45/79/wKiom1PoYYCB8X41AAGSBoTo9IA457.jpg)
声明按钮点击事件的回调函数:
![](http://s3.51cto.com/wyfs02/M01/45/7A/wKioL1PoYqjxtwpLAAA8iaC3n1Q369.jpg)
然后在事件映射处添加事件映射:
![](http://s3.51cto.com/wyfs02/M02/45/7A/wKioL1PoYrDBAW-8AAE0uqgYFNo674.jpg)
编译运行。点击按钮,没有弹出对话框。嗯,这样就对了,我们还有一个步骤没做。增加事件类的DispEventAdvise。在连接函数中增加如下代码:
![](http://s3.51cto.com/wyfs02/M00/45/7A/wKioL1PoYrnRFCLIAAA4wi5oi7E503.jpg)
别忘了,在断开连接的地方释放事件响应:
![](http://s3.51cto.com/wyfs02/M01/45/7A/wKioL1PoYsDxRxAJAACSWcSXKxk127.jpg)
![](http://s3.51cto.com/wyfs02/M02/45/7A/wKioL1PoYsuQ88m-AACOgDMobJU039.jpg)
好了,一个插件就完成了,亲们, 赶紧去试试吧,不懂的地方,请猛点这里官网。
1、在visual C++编程环境下,利用向导生成一个名为PDFAddin的ATL COM Appwizard工程(图一):
![](http://s3.51cto.com/wyfs02/M02/45/7A/wKioL1PoYcOic7wyAAJyPHgE6UE942.jpg)
在向导的设置中采用默认设置,选择Next。然后单击Finish,这样一个空的ATL project就产生了(如图二)。
![](http://s3.51cto.com/wyfs02/M01/45/79/wKiom1PoYLzCzRqwAAHpmCCC640246.jpg)
2、插入一个ATL的简单对象: 选择菜单Project—>Add Class...,出现类向导对话框(如图三),单击Add:
![](http://s3.51cto.com/wyfs02/M02/45/79/wKiom1PoYMjS6g2tAALt_Is-NDA030.jpg)
输入简单对象类名称,如PDFReader。注意一点的地方是VS2010 ProgID自己填写,这个名字很重要,最后编译生成的文件名称必须用这个命名。示例所示为iStylePDF.PDFReader。最后编译的控件名称为iStylePDF.PDFReader.spi(如图四),单击Next。
![](http://s3.51cto.com/wyfs02/M01/45/7A/wKioL1PoYinT4BBVAAF_1kh3kd8897.jpg)
文件类型选项采用默认值。选项页的设置根据自己的需要是否设置连接点和ISupportErrorInfo支持,其他采用默认值即可。(如图五),单击完成。一个基本的COM组件就创建了,编译该工程看是否正常。现在该控件还没有和iStylePDF关联起来。接下来是重点设置。
![](http://s3.51cto.com/wyfs02/M02/45/79/wKiom1PoYR-ynOugAAGNyAIJtjs826.jpg)
3、在CPDFReader类中实现ISPExtensibility的接口:
ISPExtensibility是iStylePDF类型库中的一个虚接口类。插件程序的CPDFReader只要继承并实现该类的几个接口就能和宿主程序关联。添加继承虚接口类步骤如下,首先选择类视图,找到ATL的简单对象类,右键单击弹出菜单,选择Add->Implement Interface。如图六
![](http://s3.51cto.com/wyfs02/M00/45/79/wKiom1PoYSujjY7pAAJ3KFbpfV4161.jpg)
可用的类型库名称中选择iStylePDF ObjectLibrary<1.0>,如果类型库中没有,说明控件没有注册,也可以从文件选择iStylePDF.ocx。接口中选择ISPExtensibility,移动到右边的实现接口类中,单击完成。如图七。
![](http://s3.51cto.com/wyfs02/M00/45/7A/wKioL1PoYlDyu_EeAAHXoGaLM_k692.jpg)
现在就自动添加了ISPExtensibility接口类的接口函数,OnConnection,OnDisconnection主要使用这两个函数。修改输出文件名称,编译成功之后。即可放到iStylePDF安装目录的plugins目下,平台启动就会加载该插件。目前插件什么功能都没有实现,所以什么看不到,下面介绍添加一个工具条。
![](http://s3.51cto.com/wyfs02/M00/45/79/wKiom1PoYUPxvhvTAAIKCME329c738.jpg)
4、添加工具栏按钮: 添加工具栏按钮可以再程序连接的函数中实现。OnConnection参数是一个Application顶级对象,通过该对象可以获取所有的其他对象。请参考对象模型。我们定义一个变量把Application指针保存起来。
![](http://s3.51cto.com/wyfs02/M02/45/7A/wKioL1PoYmqxlMFtAABJN1bvSNE683.jpg)
OnConnection的实现如下代码:
![](http://s3.51cto.com/wyfs02/M00/45/7A/wKioL1PoYnWh5C-MAALMYESCnYc352.jpg)
CommandBar的函数说明请参考对象模型。编译运行工具栏就加进去了。如图九
![](http://s3.51cto.com/wyfs02/M02/45/79/wKiom1PoYWjAUybUAABy4GkXDjs130.jpg)
5、按钮事件的添加: 按钮添加了,需要接收按钮的事件,下面就是要介绍实现Event的响应。ATL为COM对象的Idispatch接口提供了两个模板类:IDispEventImpl<>和IDispEventSimpleImpl<>,选择IDispEventSimpleImpl<>,因为它不需要额外的类型库信息,从IDispEventSimpleImpl<>继承一个类:
![](http://s3.51cto.com/wyfs02/M00/45/79/wKiom1PoYXLC5_HLAABXp9bFKiw718.jpg)
然后再添加事件映射宏即可接收事件。BEGIN_SINK_MAP(CPDFReader) END_SINK_MAP()
接下来我们要做的是为按钮加单击事件。首先要用_ATL_SINK_INFO结构描述回调的参数信息,必须声明为外部变量,我们为事件预定义了一些参数说明,如下:
![](http://s3.51cto.com/wyfs02/M01/45/79/wKiom1PoYYCB8X41AAGSBoTo9IA457.jpg)
声明按钮点击事件的回调函数:
![](http://s3.51cto.com/wyfs02/M01/45/7A/wKioL1PoYqjxtwpLAAA8iaC3n1Q369.jpg)
然后在事件映射处添加事件映射:
![](http://s3.51cto.com/wyfs02/M02/45/7A/wKioL1PoYrDBAW-8AAE0uqgYFNo674.jpg)
编译运行。点击按钮,没有弹出对话框。嗯,这样就对了,我们还有一个步骤没做。增加事件类的DispEventAdvise。在连接函数中增加如下代码:
![](http://s3.51cto.com/wyfs02/M00/45/7A/wKioL1PoYrnRFCLIAAA4wi5oi7E503.jpg)
别忘了,在断开连接的地方释放事件响应:
![](http://s3.51cto.com/wyfs02/M01/45/7A/wKioL1PoYsDxRxAJAACSWcSXKxk127.jpg)
![](http://s3.51cto.com/wyfs02/M02/45/7A/wKioL1PoYsuQ88m-AACOgDMobJU039.jpg)
好了,一个插件就完成了,亲们, 赶紧去试试吧,不懂的地方,请猛点这里官网。
相关文章推荐
- 使用VC++ ATL实现iStylePDF的COM插件
- 使用VC++ ATL实现iStylePDF的COM插件
- 使用VC++ ATL实现Office的COM插件
- 使用VC++ ATL开发Office COM插件(二)
- 【outlook plugin】利用VC++/ATL开发Office 2003 COM插件
- 使用VC++ ATL开发Office COM插件(三)
- VC++内部COM插件的编程实现
- VC++内部COM插件的编程实现
- VC++内部COM插件的编程实现
- vue插件开发 使用pdf.js实现手机端在线预览pdf文档
- vue插件开发之使用pdf.js实现手机端在线预览pdf文档的方法
- 这是我学习COM遇到的几个基本问题其解决 黄森堂(vcmfc)著 1.我用ATL生成一个组件对象,我在COM中使用IDD_IEncrypt,这个在哪里写义,是啥?GUID? 答:IDD_IEncry
- 使用Maven2 com4j插件实现Java COM Bridge
- 使用VC++ ATL开发Office COM插件(一)
- Developing COM Components using VC-ATL(1-2)
- Developing COM Components using VC-ATL(3-5)
- Developing COM Components using VC-ATL(3-2)
- Developing COM Components using VC-ATL(3-7)
- Developing COM Components using VC-ATL(3-6)
- Developing COM Components using VC-ATL(2-4)