新浪微博
腾讯微博
会员列表
统计排行
基本信息
到访IP统计
管理团队
管理统计
在线会员
会员排行
版块排行
帖子排行
标签排行
帮助
下拉
用户名
电子邮箱
用户名
密 码
记住登录
登录
找回密码
注册
快捷通道
关闭
您还没有登录,快捷通道只有在登录后才能使用。
立即登录
还没有帐号? 赶紧
注册一个
首页
论坛
Qt下载
作品展
群组
个人中心
捐赠、管理与开发
邮件订阅
帖子
文章
日志
用户
版块
群组
帖子
搜索
QTCN开发网
>
Qt基础编程
>
【提问】插件软件如何设计
发帖
回复
返回列表
新帖
14029
阅读
3
回复
【提问】插件软件如何设计
[复制链接]
上一主题
下一主题
离线
selong
UID:2843
注册时间
2005-12-30
最后登录
2006-02-14
在线时间
0小时
发帖
24
搜Ta的帖子
精华
0
金钱
125
威望
56
贡献值
0
好评度
0
访问TA的空间
加好友
用道具
新手上路
关闭
个人中心可以申请新版勋章哦
立即申请
知道了
加关注
发消息
只看楼主
倒序阅读
楼主
发表于: 2006-01-22
读了 goldboar的平台+插件软件设计思想及基于COM的原型实现,再加上自己的软件的需求,感觉很有必要将自己的软件设计成插件更新的方式。
平台+插件软件设计基本思想
插件的本质在于不修改程序主体(平台)的情况下对软件功能进行扩展与加强,当插件的接口公开后,任何公司或个人都可以制作自己的插件来解决一些操作上的不便或增加新的功能,也就是实现真正意义上的“即插即用”软件开发。平台+插件软件结构是将一个待开发的目标软件分为两部分,一部分为程序的主体或主框架,可定义为平台,另一部分为功能扩展或补充模块,可定义为插件。
在进行软件开发之前,是否采用平台+插件结构进行软件开发,还要依据具体的软件需求情况进行确定,但一般来讲,使用平台+插件结构进行软件设计会给所开发软件增加新的生命力。当确定平台+插件的软件结构之后,就要分析哪些部分功能由主体完成,即平台的基本功能,哪些部分功能由插件完成,即需要扩展的插件功能。平台所完成的功能应为一个软件系统的核心和基础,这些基本功能即可为用户使用,也可为插件使用,就是又可以把平台基本功能分为两个部分,内核功能和插件处理功能。平台的内核功能是整个软件的重要功能,一个软件的大部分功能因由内核功能完成。平台的插件处理功能用于扩展平台和管理插件,为插件操纵平台和与插件通信提供标准平台扩展接口。插件所完成的功能是对平台功能的扩展与补充,一般插件完成系列化功能,例如:PHOTOSHOP的滤镜插件完成对图形的特殊效果处理,这些功能都有一些共性,可以进行集中管理,并且是可以定义出标准的插件接口。
为了实现平台+插件结构的软件设计需要定义两个标准接口,一个为由平台所实现的平台扩展接口,一个为插件所实现的插件接口。这里需要说明的是:平台扩展接口完全由平台实现,插件只是调用和使用,插件接口完全由插件实现,平台也只是调用和使用。平台扩展接口实现插件向平台方向的单向通信,插件通过平台扩展接口可获取主框架的各种资源和数据,可包括各种系统句柄,程序内部数据以及内存分配等。插件接口为平台向插件方向的单向通信,平台通过插件接口调用插件所实现的功能,读取插件处理数据等。
平台插件处理功能包括插件注册、管理和调用,以及平台扩展接口的功能实现。插件注册为按照某种机制首先在系统中搜索已安装插件,之后将搜索到的插件注册到平台上,并在平台上生成相应的调用机制,这包括菜单选项、工具栏、内部调用等。插件管理完成插件与平台的协调,为各插件在平台上生成管理信息以及进行插件的状态跟踪。插件调用为调用各插件所实现的功能。平台插件处理功能实现的另一部分功能为平台扩展接口的具体实现。
平台+插件软件设计步骤包括:
1、 确定平台基本功能和插件要完成系列化功能或扩展功能;
2、 定义平台扩展接口和插件接口;
3、 完成平台设计,主要是平台插件处理功能;
4、 向插件开发者提供主平台程序(执行代码),公布平台扩展接口和插件要实现的接口,可能包括开发用的SDK;
5、 插件开发者按要求开发插件,实现插件接口,开发者可使用提供的主平台程序测试插件;
6、 主平台设计者继续完成主平台的内核功能,并可随时公布新增加主平台扩展接口和插件接口;
7、 实现4-6步骤的良性循环,整个软件系统不断向前进化。
平台+插件软件设计的优点:
1、 实现真正意义上的软件组件的“即插即用”;
2、 在二进制级上集成软件,减少大量的软件重新编译与发布麻烦与时间;
3、 能够很好实现软件模块的分工开发,能够大量吸取他人的优长;
4、 可较好实现代码隐藏,保护知识产权。
三、基于COM的原型实现
平台+插件软件的目标及设计思路已经明确,那么用什么样的方法和技术实现插件(程序插件),从目前已有这方面软件的设计方法来看(Windows系统上的软件),一种是使用传统DLL方法的实现,一种是使用COM方法的实现。下面就以COM技术为基础,实现一个基本的原型框架设计。COM技术的原理大家都已经相当熟悉,本文为了实现平台+插件的几方面功能,相应地采用COM的相关方面技术与方法来介绍有关实现要点。整个原型系统开发环境:Windows 2000、Visual C++ 7.0,使用的开发库包括MFC和ATL。
插件注册 为了管理插件首先是设计一种插件的注册机制,通过此种机制平台可以搜索到系统中所有的可用插件,并在平台上生成各插件的调用点。注册就需要为每插件设置一个特殊标识,有了这个标识的插件,平台就可以使用。使用COM实现注册机制有一种非常好的方法,这就是组件目录(Component Category)。组件目录也是COM实现的标准接口(Interface,不同于平台+插件中所说的接口)。在设计COM组件时,只为其定义一个目录分类信息即可,之后就可使用标准的组件目录接口在系统中搜索特定类型的组件,插件注册与标识就可轻松地解决了。
插件管理与调用 由组件目录获得特定标识的组件后,就需要为每个插件生成管理机制,每个插件都有一个类ID(CLSID),在平台中为每个插件生成一个类ID数组,每个插件的每一个可调用功能均生成一个菜单项(动态生成菜单项)。对每个插件是否激活,平台都有相应的记录信息。插件调用可通过菜单消息循环或内部调用实现。
平台扩展接口和插件接口 这两个接口不同于COM技术中的接口,但平台扩展接口和插件接口可使用COM技术的接口定义实现。在原型系统的实现上平台扩展接口定义了一个IServer接口,插件接口定义了一个IPlugin接口。IServer接口用于为插件传递内部数据接口,IPlugin接口用于读取插件功能信息,并且还用于传递平台消息与资源句柄。
消息、资源与数据传递 平台与插件之间需要进行大量的消息与数据交互,其中包括:各种Windows消息、各种Windows资源句柄,以及系统使用的各种内部数据,有时还可能需要分配内存。所有的消息与数据交互均由平台扩展接口和插件接口所定义的标准方法实现,在原型系统中已经实现了鼠标消息、窗口句柄、设备句柄和程序内部定义数据结构的传递。
结 论:原型系统已实现一种通用的平台+插件软件开发的框架模式,通过实践证明这种思路和设计方法可行,可以应用到我们的具体软件开发上。通过这种方式可以很好地解决软件合作开发与集成问题,对有版本级别的软件开发更为有用。高级版的软件安装有高级版的插件,低级版的软件不安装高级版的插件,这就给程序分发和开发带来极大的便利。对于有系列化功能的软件,系列化功能由插件实现。
备注:若需要源代码资料请与作者联系。(2003年9月23日)
插件编写,说起来容易,其实就是程序主体中定义好基类接口,在插件中用派生类实现这些接口,然后定义基类的指针,指向接口所在的具体类的对象,调用相关接口函数就好了。
但作为一个工程,势必会有较多的插件产生,如何管理这些插件,我就不清楚了。然后在qt平台下,插件如何编写,如何管理,如何设计,还望各位指教。
下面是一些windows平台下的插件编写文章。
由云台协议DLL浅谈插件程序的编写
http://blog.csdn.net/waterpub/archive/2004/12/25/228920.aspx
http://blog.csdn.net/waterpub/archive/2004/12/25/228925.aspx
C++资源之不完全导引
http://blog.csdn.net/waterpub/archive/2004/12/21/224013.aspx
另一种 WinDbg 插件编写方法 - Debugger Engine Extension
http://blog.csdn.net/flier_lu/archive/2004/07/07/36428.aspx
思考插件架构体系
http://kb.csdn.net/java/articles/200511/76e93daf-5d8b-43b4-aea2-e35a041149bf.html
VC++开发BHO插件(引用)
http://blog.csdn.net/civet148/archive/2005/10/19/508895.aspx
在C#程序中实现插件架构 - Sunmast翻译
http://blog.csdn.net/vieri_ch/archive/2005/10/13/502441.aspx
C#插件构架实战
http://blog.csdn.net/ycl111/archive/2005/10/08/497313.aspx
学习插件技术原理后的一点认识
http://blog.csdn.net/stella_tangxing/archive/2005/04/28/366850.aspx
给程序添加插件
http://blog.csdn.net/hellotianma/archive/2005/05/28/382686.aspx
DLL插件(转)
http://blog.csdn.net/lionhearter/archive/2004/12/28/232299.aspx
插件系统的设计(转贴)
http://blog.csdn.net/chenlq/archive/2004/12/27/230433.aspx
做虚假的插件
http://blog.csdn.net/ghj1976/archive/2004/11/24/193631.aspx
功能插件
http://blog.csdn.net/gzzzz/archive/2004/08/21/81187.aspx
平台+插件软件设计思想及基于COM的原型实现
http://blog.csdn.net/goldboar/archive/2003/09/28/21595.aspx
深入浅出Dll(介绍函数导出、类导出、钓子dll、不同语言混合编程方法、插件等的实现方法) 选择自 iceezone 的 Blog
http://blog.csdn.net/yesnoor/archive/2005/10/20/510037.aspx
DLL插件
http://blog.csdn.net/martinwang/archive/2005/08/18/457778.aspx
[ 此贴被selong在2006-01-22 19:08重新编辑 ]
附件:
PluginDemo.zip
(393 K) 下载次数:127
共
条评分
回复
举报
分享到
淘江湖
新浪
QQ微博
QQ空间
开心
人人
豆瓣
网易微博
百度
鲜果
白社会
飞信
离线
yfy002
UID:156
注册时间
2005-07-01
最后登录
2024-06-27
在线时间
41小时
发帖
133
搜Ta的帖子
精华
6
金钱
648
威望
141
贡献值
10
好评度
38
访问TA的空间
加好友
用道具
侠客
加关注
发消息
只看该作者
1楼
发表于: 2006-01-23
QPluginLoader
共
条评分
我渴望平静,风却给了我涟漪
我的blog:
http://sungaoyong.cublog.cn
回复
举报
离线
selong
UID:2843
注册时间
2005-12-30
最后登录
2006-02-14
在线时间
0小时
发帖
24
搜Ta的帖子
精华
0
金钱
125
威望
56
贡献值
0
好评度
0
访问TA的空间
加好友
用道具
新手上路
加关注
发消息
只看该作者
2楼
发表于: 2006-01-23
thank you!
qt中补丁程序的编写过程:
Making an application extensible through plugins involves the following steps:
1、Define a set of interfaces (classes with only pure virtual functions) used to talk to the plugins.
2、Use the Q_DECLARE_INTERFACE() macro to tell Qt's meta-object system about the interface.
3、Use QPluginLoader in the application to load the plugins.
4、Use qobject_cast() to test whether a plugin implements a given interface.
Writing a plugin involves these steps:
1、Declare a plugin class that inherits from QObject and from the interfaces that the plugin wants to provide.
2、Use the Q_INTERFACES() macro to tell Qt's meta-object system about the interfaces.
3、Export the plugin using the Q_EXPORT_PLUGIN() macro.
4、Build the plugin using an suitable .pro file.
这是qt参考文档上说的,连接如下:
http://doc.trolltech.com/4.1/plugins-howto.html#the-higher-level-api-writing-qt-extensions
共
条评分
回复
举报
离线
hunterzf
UID:42250
注册时间
2008-03-31
最后登录
2019-08-26
在线时间
18小时
发帖
111
搜Ta的帖子
精华
0
金钱
1118
威望
112
贡献值
0
好评度
111
访问TA的空间
加好友
用道具
侠客
加关注
发消息
只看该作者
3楼
发表于: 2010-11-10
谢谢了,真是好东西,还有没有更好的东西
共
条评分
回复
举报
发帖
回复
返回列表
http://www.qtcn.org/bbs
访问内容超出本站范围,不能确定是否安全
继续访问
取消访问
快速回复
限100 字节
您目前还是游客,请
登录
或
注册
进入高级模式
文字颜色
发 布
回复后跳转到最后一页
上一个
下一个
关闭
补充发布信息
验证码:
发 布
隐藏
快速跳转
站务及资讯
网站公告
新闻资讯
Qt官方发布
网站管理
Qt应用及资源
Qt 作品展
Qt代码秀
Qt应用版
Qt技术讨论区
Qt安装与发布
Qt中文处理
Qt基础编程
Qt QML开发
Qt嵌入式开发
Qt移动平台开发
其它技术开发讨论区
Qt图书专区
《C++ GUI Qt 4编程》(第2版)专栏
《Qt高级编程》专栏
《零基础学Qt4编程》专栏
《Qt设计模式》(第2版) 图书专栏
Python Qt GUI快速编程
Qt项目开发区
天池项目
Qt开放平台开发库
机械CAD
扇贝词典
非活跃项目区
社区中心
帖子回收站(Trash)
招聘、求职、供求、广告等
休闲娱乐
关闭
关闭
选中
1
篇
全选