本文介绍了一种使用VC++ ATL(Active Template Library),利用ISPExtensibility接口,为 iStylePDF 加入功能简单的COM插件(addin),加入工具栏按钮等可视部件,并为其加入响应事件的方法。我们采用VS2010为iStylePDF平台开发插件,当然也可以使用其他VS工具。开发插件的第一步需要安装iStylePDF的客户端,客户端程序中包括了ActiveX控件,这个是我们需要用到的类型库。如果没有客户端,请进入这里下载。下面开始逐步介绍开发步骤。

  1、在visual C++编程环境下,利用向导生成一个名为PDFAddin的ATL COM Appwizard工程(图一):

在向导的设置中采用默认设置,选择Next。然后单击Finish,这样一个空的ATL project就产生了(如图二)。

2、插入一个ATL的简单对象:

  选择菜单Project—>Add Class...,出现类向导对话框(如图三),单击Add:

输入简单对象类名称,如PDFReader。注意一点的地方是VS2010 ProgID自己填写,这个名字很重要,最后编译生成的文件名称必须用这个命名。示例所示为iStylePDF.PDFReader。最后编译的控件名称为iStylePDF.PDFReader.spi(如图四),单击Next。

文件类型选项采用默认值。选项页的设置根据自己的需要是否设置连接点和ISupportErrorInfo支持,其他采用默认值即可。(如图五),单击完成。一个基本的COM组件就创建了,编译该工程看是否正常。现在该控件还没有和iStylePDF关联起来。接下来是重点设置。

3、在CPDFReader类中实现ISPExtensibility的接口: 
ISPExtensibility是iStylePDF类型库中的一个虚接口类。插件程序的CPDFReader只要继承并实现该类的几个接口就能和宿主程序关联。添加继承虚接口类步骤如下,首先选择类视图,找到ATL的简单对象类,右键单击弹出菜单,选择Add->Implement Interface。如图六

可用的类型库名称中选择iStylePDF Object Library<1.0>,如果类型库中没有,说明控件没有注册,也可以从文件选择iStylePDF.ocx。接口中选择ISPExtensibility,移动到右边的实现接口类中,单击完成。如图七。

现在就自动添加了ISPExtensibility接口类的接口函数,OnConnection,OnDisconnection主要使用这两个函数。修改输出文件名称,编译成功之后。即可放到iStylePDF安装目录的plugins目下,平台启动就会加载该插件。目前插件什么功能都没有实现,所以什么看不到,下面介绍添加一个工具条。

4、添加工具栏按钮:

添加工具栏按钮可以再程序连接的函数中实现。OnConnection参数是一个Application顶级对象,通过该对象可以获取所有的其他对象。请参考对象模型。我们定义一个变量把Application指针保存起来。

OnConnection的实现如下代码:

CommandBar的函数说明请参考对象模型。编译运行工具栏就加进去了。如图九

5、按钮事件的添加:

按钮添加了,需要接收按钮的事件,下面就是要介绍实现Event的响应。ATL为COM对象的Idispatch接口提供了两个模板类:IDispEventImpl<>和IDispEventSimpleImpl<>,选择IDispEventSimpleImpl<>,因为它不需要额外的类型库信息,从IDispEventSimpleImpl<>继承一个类:

然后再添加事件映射宏即可接收事件。 BEGIN_SINK_MAP(CPDFReader) END_SINK_MAP() 
接下来我们要做的是为按钮加单击事件。 首先要用_ATL_SINK_INFO结构描述回调的参数信息,必须声明为外部变量,我们为事件预定义了一些参数说明,如下:

声明按钮点击事件的回调函数:

然后在事件映射处添加事件映射:

编译运行。点击按钮,没有弹出对话框。嗯,这样就对了,我们还有一个步骤没做。增加事件类的DispEventAdvise。 在连接函数中增加如下代码:

别忘了,在断开连接的地方释放事件响应:

好了,一个插件就完成了。

使用VC++ ATL实现iStylePDF的COM插件的更多相关文章

  1. vc code 一个非常不错的插件

    https://marketplace.visualstudio.com/items?itemName=CoenraadS.bracket-pair-colorizer 这个是地址,前提下是安装了vc ...

  2. Grid++Report支持CS/BS模式的表报插件

    Grid++Report 可用于开发桌面C/S报表与WEB报表(B/S报表),C/S报表开发适用于VB.NET.C#.VB.VC.Delphi等.WEB报表开发适用于ASP.ASP.NET.JSP/J ...

  3. [转]C/C++:构建你自己的插件框架

    本文译自Gigi Sayfan在DDJ上的专栏文章.Gigi Sayfan是北加州的一个程序员,email:gigi@gmail.com. 本文是一系列讨论架构.开发和部署C/C++跨平台插件框架的文 ...

  4. [转]用C++实现插件体系结构

    本文讨论一种简单却有效的插件体系结构,它使用C++,动态链接库,基于面向对象编程的思想.首先来看一下使用插件机制能给我们带来哪些方面的好处,从而在适当时候合理的选择使用. 1. 增强代码的透明度与一致 ...

  5. Grid++Report

    ylbtech-Miscellaneos:Grid++Report 1. 关于Grid++Report返回顶部 Grid++Report 可用于开发桌面C/S报表与WEB报表(B/S报表),C/S报表 ...

  6. 再见VB6!再见程序生涯!

    今天写一篇博文告别使用了15年的VB6,从此终结程序生涯.记得读大学的时候第一学习编程,用VB6嵌入MediaPlayer控件写了一个简易视频播放器,看着视频的画面激动人心,从此就爱上了编程,从此也和 ...

  7. OPNET 安装运行问题总结

    OPNET作为专业级网络仿真软件,其强大的功能使其在多个领域有广泛的应用.“越强大的软件,安装越闹心”,OPNET就是这样一款安装和运行的都很闹心的软件,这里简单转载和记录我安装OPNET和使用中的问 ...

  8. Version history of VC++, MFC and ATL

    I have tried to assemble together information about the Visual C++ releases, the compiler and the fr ...

  9. VC++、MFC、COM和ATL的区别

    今天看到的,感觉不错.转载了 一.什么是MFC 微软基础类(Microsoft Foundation Classes),实际上是微软提供的,用于在C++环境下编写应用程序的一个框架和引擎,VC++是W ...

随机推荐

  1. [原创]java WEB学习笔记105:Spring学习---AOP介绍,相关概念,使用AOP,利用 方法签名 编写 AspectJ 切入点表达式

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  2. (转)如何将本地git仓库上传到GitHub中托管+实践心得

    Git——新手入门与上传项目到远程仓库GitHub(转) - Chen_s - 博客园http://www.cnblogs.com/Chenshuai7/p/5486278.html 注意的问题: 1 ...

  3. 有一道题,大家能帮我看一下哪里错了吗?c++的

    有一道题我不知道是哪里错了,大神们帮忙看一下,谢谢! 试题描述: 在四位自然数中有这样一些特点的数:(1)它们是素数:(2)将这些素数加上45后得到一个新的数值:(3)请同学们在这些新的数值中挑选出: ...

  4. AjaxStudyNote

    AjaxStudyNoteBy:Silvers:(E:\Video_Tutorials\Java自学视频\尚硅谷JavaEE培训\6WEB基础-Ajax)15:02 2016/2/29什么是AjaxA ...

  5. 彻底弄懂css中单位px和em,rem的区别

    国内的设计师大都喜欢用px,而国外的网站大都喜欢用em和rem,那么三者有什么区别,又各自有什么优劣呢? PX特点 -1. IE无法调整那些使用px作为单位的字体大小: -2. 国外的大部分网站能够调 ...

  6. make命令以及makefile

    make命令以及makefile使用RCS与CVS进行源代码控制编写手册页使用patch与tar发布软件开发环境 多源代码的问题 当我们编写小程序时,许多人都是简单的在编辑后通过重新编译所有的文件重新 ...

  7. android 官方文档 JNI TIPS

    文章地址  http://developer.android.com/training/articles/perf-jni.html JNI Tips JNI is the Java Native I ...

  8. nodejs ejs 请求路径和静态资源文件路径

    /XXX 会跳转到  http://域名:端口/XXX ./XXX  会跳转到 当前路径+/XXX XXX(../XXX) 会跳转到 当前路径父级+XXX

  9. caffe model 可视化

    1. 打开网址 http://ethereon.github.io/netscope/#/editor 2.将自己的train_test.prototxt里的复制粘贴到左边 3.然后同时shift+e ...

  10. ftp相关资料

    一.ftp状态码 110  重新启动标记应答.在这种情况下文本是确定的,它必须是:MARK   yyyy=mmmm,其中yyyy是用户进程数据流标记,mmmm是服务器标记.      120     ...