关于Plugin大家有没有什么好意见

12 views
Skip to first unread message

怀宇范

unread,
Oct 22, 2007, 2:28:16 AM10/22/07
to pon...@googlegroups.com
想请教一下大家都怎么做插件平台的。
 
我们在MFC下这么做:
 
1. 平台中:
a. 提供一组钩子函数
b. 插件管理器,负责管理插入的Dlls,并负责相关菜单、对话框的注册
 
2. 插件中:
a. 实现一组钩子
b. 实现管理所需的一些接口,比如GetPlugID之类的
c. 实现需要的菜单、工具栏、对话框资源,并实现相关的函数和类
 
感觉蛮繁重的,不知道大家有什么好意见,谢谢:)

--
彪悍的人生,不需要解释。

bool ContactMe(person you)
{
    if(you.GoTo("14#344, Tsinghua") && you.Find("范怀宇"))return true;
    if(you.MailTo (" dugu...@gmail.com ") || you.MailTo(" fan...@mails.tsinghua.edu.cn "))return true;
    if(you.PhoneTo("13488810330") || you.PhoneTo("01062778689"))return true;
    if(you.QQTo("120628812") || you.MSNTo(" dugu...@hotmail.com"))return true;
    if(you.NetTo(" www.cnblogs.com/duguguiyu "))return true;
    return false;
}

shark

unread,
Oct 22, 2007, 3:28:04 AM10/22/07
to pon...@googlegroups.com
参考Boost Soc 2007 Boost.Extension

red...@gmail.com

unread,
Oct 22, 2007, 2:45:25 AM10/22/07
to pon...@googlegroups.com
将所有的 C++ 代码写成某个脚本的模块, 用脚本控制整个程序的流程.
plugin 的框架, 就在脚本这个层次想, 用脚本以及模块来完成 :)

怀宇范 写道:


> 想请教一下大家都怎么做插件平台的。
> 我们在MFC下这么做:
> 1. 平台中:
> a. 提供一组钩子函数
> b. 插件管理器,负责管理插入的Dlls,并负责相关菜单、对话框的注册
> 2. 插件中:
> a. 实现一组钩子
> b. 实现管理所需的一些接口,比如GetPlugID之类的
> c. 实现需要的菜单、工具栏、对话框资源,并实现相关的函数和类
> 感觉蛮繁重的,不知道大家有什么好意见,谢谢:)
>
> --
> 彪悍的人生,不需要解释。
>

> ---~----~----~----~------~----~------~--~---
>

oldrev

unread,
Oct 22, 2007, 2:55:04 AM10/22/07
to pon...@googlegroups.com
对于C++来说,简单的插件只要DLL导出几个函数就行了,复杂的用 COM

C++几乎没有metadata,任务自然是繁重的。

在 2007-10-22一的 14:28 +0800,怀宇范写道:

--
/***************************************
Live Long and Prosper

Regards,
- oldrev
***************************************/

oldrev

unread,
Oct 22, 2007, 2:58:23 AM10/22/07
to pon...@googlegroups.com
C++没有静态反射包装起来很复杂啊,看看 boost.python 那叫一个烦,想稍微自
动化一点还要什么 gccxml 之类的外部工具帮忙。

在 2007-10-22一的 14:45 +0800,red...@gmail.com写道:

red...@gmail.com

unread,
Oct 22, 2007, 3:11:15 AM10/22/07
to pon...@googlegroups.com
这也是我觉得 D 比 C++ 好的一个地方, pyd 的使用比 boost.python 简单很多啊.
可写 pyd 现在还不能用在 tango 上 :(

oldrev 写道:

oldrev

unread,
Oct 22, 2007, 3:18:10 AM10/22/07
to pon...@googlegroups.com
pyd 没有用 2.0 的静态反射,还是比较麻烦,要不能这样:
WrapClass(MyDClass); 。

相比起 py我比较喜欢ruby,所以最好是有个通用的脚本语言绑定库 :)

在 2007-10-22一的 15:11 +0800,red...@gmail.com写道:

red...@gmail.com

unread,
Oct 22, 2007, 3:19:37 AM10/22/07
to pon...@googlegroups.com
SWIG 不就是吗 ?

oldrev 写道:

怀宇范

unread,
Oct 22, 2007, 3:20:57 AM10/22/07
to pon...@googlegroups.com
现在这个方案感觉都不是在用C++了。。。基本接口限定都是通过钩子来限定,恩还有一些Command的函数。。
 
我原来做的一个平台是基于Interface。。目前没感觉出太多的不适。。。

 
在07-10-22,oldrev <old...@gmail.com> 写道:
    if(you.PhoneTo ("13488810330") || you.PhoneTo("01062778689"))return true;

怀宇范

unread,
Oct 22, 2007, 3:22:25 AM10/22/07
to pon...@googlegroups.com
做过用脚本驱动。。。碰到了很多的问题。。。

在07-10-22,red...@gmail.com <red...@gmail.com> 写道:

--
彪悍的人生,不需要解释。

bool ContactMe(person you)
{
    if(you.GoTo("14#344, Tsinghua") && you.Find("范怀宇"))return true;
    if(you.MailTo (" dugu...@gmail.com ") || you.MailTo(" fan...@mails.tsinghua.edu.cn "))return true;
    if(you.PhoneTo ("13488810330") || you.PhoneTo("01062778689"))return true;

oldrev

unread,
Oct 22, 2007, 3:26:58 AM10/22/07
to pon...@googlegroups.com
SWIG不能算库吧,再说又不支持D。

在 2007-10-22一的 15:19 +0800,red...@gmail.com写道:

李扬

unread,
Oct 22, 2007, 3:28:11 AM10/22/07
to pon...@googlegroups.com
c++ 没有abi:( 最近也想做这方面的事情,想来想去还是全部做成c 接口的。。。
然后再像jni 用一套名字规则来表明哪个函数属于哪个接口。


 
在07-10-22,怀宇范 <dugu...@gmail.com> 写道:

oldrev

unread,
Oct 22, 2007, 3:35:57 AM10/22/07
to pon...@googlegroups.com
有个简单的模拟COM方案:
首先定义一个DLL导出函数,IPlugin* CreatePlugin(),返回纯虚类IPlugin,再
由 IPlugin 执行插件的功能或创造其他对象。

在 2007-10-22一的 14:28 +0800,怀宇范写道:

怀宇范

unread,
Oct 22, 2007, 4:04:52 AM10/22/07
to pon...@googlegroups.com
恩。主要目标是降低插件开发的难度,尽量降低了解一大堆钩子,编写一堆资源文件的负担。
写在想着在上面添加一些自动化的工具。。。总之都不好搞定。。。

 
在07-10-22,oldrev <old...@gmail.com> 写道:
有个简单的模拟COM方案:
首先定义一个DLL导出函数,IPlugin* CreatePlugin(),返回纯虚类IPlugin,再
由 IPlugin 执行插件的功能或创造其他对象。

在 2007-10-22一的 14:28 +0800,怀宇范写道:
> 想请教一下大家都怎么做插件平台的。
>
> 我们在MFC下这么做:
>
> 1. 平台中:
> a. 提供一组钩子函数
> b. 插件管理器,负责管理插入的Dlls,并负责相关菜单、对话框的注册
>
> 2. 插件中:
> a. 实现一组钩子
> b. 实现管理所需的一些接口,比如GetPlugID之类的
> c. 实现需要的菜单、工具栏、对话框资源,并实现相关的函数和类
>
> 感觉蛮繁重的,不知道大家有什么好意见,谢谢:)
>
> --
> 彪悍的人生,不需要解释。
>
> bool ContactMe(person you)
> {
>     if( you.GoTo("14#344, Tsinghua") && you.Find("范怀宇"))return true;

>     if(you.MailTo (" dugu...@gmail.com ") || you.MailTo("
> fan...@mails.tsinghua.edu.cn "))return true;
>     if(you.PhoneTo("13488810330") || you.PhoneTo("01062778689"))return
> true;
>     if( you.QQTo("120628812") ||

> you.MSNTo("dugu...@hotmail.com"))return true;
>     if(you.NetTo(" www.cnblogs.com/duguguiyu "))return true;
>     return false;
> }
>
> >
--
/***************************************
Live Long and Prosper

Regards,
- oldrev
***************************************/



{
    if(you.GoTo("14#344, Tsinghua") && you.Find("范怀宇"))return true;
    if(you.MailTo(" dugu...@gmail.com ") || you.MailTo(" fan...@mails.tsinghua.edu.cn "))return true;

李扬

unread,
Oct 22, 2007, 4:10:30 AM10/22/07
to pon...@googlegroups.com
如果要实现热插拔。。。呵呵。。。。用c++就有点自虐了。。。

在07-10-22,怀宇范 <dugu...@gmail.com> 写道:

莫华枫

unread,
Oct 22, 2007, 4:22:45 AM10/22/07
to pon...@googlegroups.com
C++没有标准abi,也只能用C接口。com或许是一种选择,只是并未比C接口有多大进步。
既然用C接口,何必用C++?
用C++自然有C++的好处。对于复杂的模块、扩展性强的模块,以及变化多的模块,C++相比C有很大的优势。
是否使用c++依赖于组件的特性。简单的,不会变化和扩展的,C可以胜任。否则,C++更好。
不管怎么样,希望Vandvood能早点把module搞定,救人们于水深火热之中。


在07-10-22,李扬 <yaya...@gmail.com> 写道:



--
反者道之动,弱者道之用
m...@seaskysh.com
longsh...@gmail.com
http://blog.csdn.net/longshanks/

清风雨

unread,
Oct 22, 2007, 10:05:31 PM10/22/07
to TopLanguage
我的不是MFC,为地图编辑器搭建的插件架构。也是发现最后接口暴多,要做的所见即所得,插件编写也是工作量比较浩繁。

不过,感觉就是拥有反射机制,也还是不如插件方的灵活的大,而且框架方的工作量增加,而插件方的工作量也不会有质的变化,毕竟那些必要的接口还是在
那。

基本上是我把框架接口暴露给插件,插件暴露实现一些必要的交互接口。互动中插件可以操作框架,这样灵活的比较大。

当然,这里讨论的跨语言的插件机制,我这里是不需要考虑的。

oldrev

unread,
Oct 22, 2007, 11:35:02 PM10/22/07
to pon...@googlegroups.com
C++在这方面确实是不如 .Net/Java 这类 metadata 丰富的平台灵活,更高级的插
件架构可以看看 SharpDevelop,整个软件都是插件由 xml 粘合起来。

在 2007-10-22一的 14:28 +0800,怀宇范写道:

stlf

unread,
Oct 23, 2007, 4:03:26 AM10/23/07
to TopLanguage

On 10月22日, 下午2时28分, "怀宇范" <dugugu...@gmail.com> wrote:
> 想请教一下大家都怎么做插件平台的。
>
> 我们在MFC下这么做:
>
> 1. 平台中:
> a. 提供一组钩子函数
> b. 插件管理器,负责管理插入的Dlls,并负责相关菜单、对话框的注册
>
> 2. 插件中:
> a. 实现一组钩子
> b. 实现管理所需的一些接口,比如GetPlugID之类的
> c. 实现需要的菜单、工具栏、对话框资源,并实现相关的函数和类
>
> 感觉蛮繁重的,不知道大家有什么好意见,谢谢:)
>
> --
> 彪悍的人生,不需要解释。
>
> bool ContactMe(person you)
> {
> if(you.GoTo("14#344, Tsinghua") && you.Find("范怀宇"))return true;

> if(you.MailTo(" dugugu...@gmail.com ") || you.MailTo("
> fanh...@mails.tsinghua.edu.cn "))return true;


> if(you.PhoneTo("13488810330") || you.PhoneTo("01062778689"))return true;

> if(you.QQTo("120628812") || you.MSNTo("dugugu...@hotmail.com"))return


> true;
> if(you.NetTo("www.cnblogs.com/duguguiyu"))return true;
> return false;
>
> }

基本还是通过C的接口函数来实现, 接口的参数可以是函数对象的指针。

freefalcon

unread,
Oct 23, 2007, 11:13:52 AM10/23/07
to TopLanguage
"热插"还是比较容易的,使用一个专门的监视对象就行
"热拔"就麻烦了,得由系统自己提供移除插件功能吧

On 10月22日, 下午4时10分, "李扬" <yayany...@gmail.com> wrote:
> 如果要实现热插拔。。。呵呵。。。。用c++就有点自虐了。。。
>

> 在07-10-22,怀宇范 <dugugu...@gmail.com> 写道:


>
>
>
>
>
> > 恩。主要目标是降低插件开发的难度,尽量降低了解一大堆钩子,编写一堆资源文件的负担。
> > 写在想着在上面添加一些自动化的工具。。。总之都不好搞定。。。
>
> > 在07-10-22,oldrev <old...@gmail.com> 写道:
>
> > > 有个简单的模拟COM方案:
> > > 首先定义一个DLL导出函数,IPlugin* CreatePlugin(),返回纯虚类IPlugin,再
> > > 由 IPlugin 执行插件的功能或创造其他对象。
>
> > > 在 2007-10-22一的 14:28 +0800,怀宇范写道:
> > > > 想请教一下大家都怎么做插件平台的。
>
> > > > 我们在MFC下这么做:
>
> > > > 1. 平台中:
> > > > a. 提供一组钩子函数
> > > > b. 插件管理器,负责管理插入的Dlls,并负责相关菜单、对话框的注册
>
> > > > 2. 插件中:
> > > > a. 实现一组钩子
> > > > b. 实现管理所需的一些接口,比如GetPlugID之类的
> > > > c. 实现需要的菜单、工具栏、对话框资源,并实现相关的函数和类
>
> > > > 感觉蛮繁重的,不知道大家有什么好意见,谢谢:)
>
> > > > --
> > > > 彪悍的人生,不需要解释。
>
> > > > bool ContactMe(person you)
> > > > {
> > > > if( you.GoTo("14#344, Tsinghua") && you.Find("范怀宇"))return true;

> > > > if(you.MailTo (" dugugu...@gmail.com ") || you.MailTo("
> > > > fanh...@mails.tsinghua.edu.cn "))return true;


> > > > if(you.PhoneTo("13488810330") || you.PhoneTo("01062778689"))return
> > > > true;
> > > > if( you.QQTo("120628812") ||

> > > > you.MSNTo("dugugu...@hotmail.com"))return true;


> > > > if(you.NetTo("www.cnblogs.com/duguguiyu"))return true;
> > > > return false;
> > > > }
>
> > > --
> > > /***************************************
> > > Live Long and Prosper
>
> > > Regards,
> > > - oldrev
> > > ***************************************/
>
> > > {
> > > if(you.GoTo("14#344, Tsinghua") && you.Find("范怀宇"))return true;

> > > if(you.MailTo(" dugugu...@gmail.com ") || you.MailTo("
> > > fanh...@mails.tsinghua.edu.cn "))return true;


> > > if(you.PhoneTo("13488810330") || you.PhoneTo("01062778689"))return
> > > true;

> > > if(you.QQTo("120628812") || you.MSNTo("dugugu...@hotmail.com"))return


> > > true;
> > > if(you.NetTo("www.cnblogs.com/duguguiyu"))return true;
> > > return false;

> > > }- 隐藏被引用文字 -
>
> - 显示引用的文字 -

freefalcon

unread,
Oct 23, 2007, 11:16:35 AM10/23/07
to TopLanguage
使用C++还是不错的选择,com接口用起来太烦琐了,不过使用C++的话得要求插件和系统得用具有同种abi的编译器开发,c和com的适应性就广得
多,与其它语言的结合性也更好

On 10月22日, 下午4时22分, "莫华枫" <longshank...@gmail.com> wrote:
> C++没有标准abi,也只能用C接口。com或许是一种选择,只是并未比C接口有多大进步。
> 既然用C接口,何必用C++?
> 用C++自然有C++的好处。对于复杂的模块、扩展性强的模块,以及变化多的模块,C++相比C有很大的优势。
> 是否使用c++依赖于组件的特性。简单的,不会变化和扩展的,C可以胜任。否则,C++更好。
> 不管怎么样,希望Vandvood能早点把module搞定,救人们于水深火热之中。
>

> 在07-10-22,李扬 <yayany...@gmail.com> 写道:
>
>
>
>
>
>
>
> > 如果要实现热插拔。。。呵呵。。。。用c++就有点自虐了。。。
>
> > 在07-10-22,怀宇范 <dugugu...@gmail.com> 写道:


>
> > > 恩。主要目标是降低插件开发的难度,尽量降低了解一大堆钩子,编写一堆资源文件的负担。
> > > 写在想着在上面添加一些自动化的工具。。。总之都不好搞定。。。
>
> > > 在07-10-22,oldrev <old...@gmail.com > 写道:
>
> > > > 有个简单的模拟COM方案:
> > > > 首先定义一个DLL导出函数,IPlugin* CreatePlugin(),返回纯虚类IPlugin,再
> > > > 由 IPlugin 执行插件的功能或创造其他对象。
>
> > > > 在 2007-10-22一的 14:28 +0800,怀宇范写道:
> > > > > 想请教一下大家都怎么做插件平台的。
>
> > > > > 我们在MFC下这么做:
>
> > > > > 1. 平台中:
> > > > > a. 提供一组钩子函数
> > > > > b. 插件管理器,负责管理插入的Dlls,并负责相关菜单、对话框的注册
>
> > > > > 2. 插件中:
> > > > > a. 实现一组钩子
> > > > > b. 实现管理所需的一些接口,比如GetPlugID之类的
> > > > > c. 实现需要的菜单、工具栏、对话框资源,并实现相关的函数和类
>
> > > > > 感觉蛮繁重的,不知道大家有什么好意见,谢谢:)
>
> > > > > --
> > > > > 彪悍的人生,不需要解释。
>
> > > > > bool ContactMe(person you)
> > > > > {
> > > > > if( you.GoTo("14#344, Tsinghua") && you.Find("范怀宇"))return true;
>

> > > > > if(you.MailTo (" dugugu...@gmail.com ") || you.MailTo("
> > > > > fanh...@mails.tsinghua.edu.cn "))return true;


> > > > > if(you.PhoneTo("13488810330") || you.PhoneTo
> > > > ("01062778689"))return
> > > > > true;
> > > > > if( you.QQTo("120628812") ||

> > > > > you.MSNTo("dugugu...@hotmail.com"))return true;


> > > > > if(you.NetTo("www.cnblogs.com/duguguiyu"))return true;
> > > > > return false;
> > > > > }
>
> > > > --
> > > > /***************************************
> > > > Live Long and Prosper
>
> > > > Regards,
> > > > - oldrev
> > > > ***************************************/
>
> > > > {
> > > > if(you.GoTo("14#344, Tsinghua") && you.Find("范怀宇"))return true;

> > > > if(you.MailTo(" dugugu...@gmail.com ") || you.MailTo("
> > > > fanh...@mails.tsinghua.edu.cn "))return true;


> > > > if(you.PhoneTo("13488810330") || you.PhoneTo("01062778689"))return
> > > > true;

> > > > if(you.QQTo("120628812") || you.MSNTo(" dugugu...@hotmail.com"))return


> > > > true;
> > > > if(you.NetTo("www.cnblogs.com/duguguiyu"))return true;
> > > > return false;
> > > > }
>
> --
> 反者道之动,弱者道之用
> m...@seaskysh.com

> longshank...@gmail.comhttp://blog.csdn.net/longshanks/- 隐藏被引用文字 -
>
> - 显示引用的文字 -

freefalcon

unread,
Oct 23, 2007, 11:32:54 AM10/23/07
to TopLanguage
从与系统的交互方式看,插件主要分为两种,一种是完全被动式,即单纯提供接口供系统调用,另一种是与系统存在交互,这时就需要系统提供接口供插件调用,
后者允许在系统之外极大的扩展系统的功能(我们开发的应用程序其实完全可以看成是操作系统的插件),相比之下开发难道也是很大的,因为在我们的实际应用
中往往很难事先知道该提供什么样的接口才完备,用户的需求总是千变万化。

另外,如果系统开放接口给插件,那么在一些场合下可能还需要考虑安全问题。从扩展性看,系统应开放尽可能多的接口,从安全性看,系统必须防止非法的插件
来访问系统避免造成破坏,或许我们可以采用数字签名等方式来验证插件的合法性,这样可行吗?不知大家有没有好的想法。

清风雨

unread,
Oct 23, 2007, 12:13:12 PM10/23/07
to TopLanguage
是的。我也是这么看的。系统开放的接口应该是自完备的(我一般是定义为做哪方面的事,这些方面涉及的控制的集合)。

有时系统的层面不同,对安全性的要求也不一样。仅仅是辅助性的框架(像我上面的地图编辑器),一般对安全性的要求很弱(我做了些简单的assert契
约,有些约束甚至没检查)。如果是系统性的框架,那么对接口应该有严格调用检查、异常处理,避免因为插件质量影响框架本身。

不过,感觉要严格检查,有时简直要疯掉(我通常对new从来都懒得去处理失败的情况)。^_^

数字签名是乎只是约束了插件,而并没有解决系统本身的容错能力、权限控制。所以,如果要安全,还是要付出更多的逻辑代价。
我在上家公司做服务器时就对每客户端连接逻辑处理进行了严格的检查,虽然在之前,也进行过网络消息加密,连接校验。从实际实施来看,编码工作量并没有特
别大的改变,就是顺着逻辑,对逻辑前提进行校验。

Reply all
Reply to author
Forward
0 new messages