怀宇范 写道:
> 想请教一下大家都怎么做插件平台的。
> 我们在MFC下这么做:
> 1. 平台中:
> a. 提供一组钩子函数
> b. 插件管理器,负责管理插入的Dlls,并负责相关菜单、对话框的注册
> 2. 插件中:
> a. 实现一组钩子
> b. 实现管理所需的一些接口,比如GetPlugID之类的
> c. 实现需要的菜单、工具栏、对话框资源,并实现相关的函数和类
> 感觉蛮繁重的,不知道大家有什么好意见,谢谢:)
>
> --
> 彪悍的人生,不需要解释。
>
> ---~----~----~----~------~----~------~--~---
>
C++几乎没有metadata,任务自然是繁重的。
在 2007-10-22一的 14:28 +0800,怀宇范写道:
--
/***************************************
Live Long and Prosper
Regards,
- oldrev
***************************************/
在 2007-10-22一的 14:45 +0800,red...@gmail.com写道:
oldrev 写道:
相比起 py我比较喜欢ruby,所以最好是有个通用的脚本语言绑定库 :)
在 2007-10-22一的 15:11 +0800,red...@gmail.com写道:
oldrev 写道:
在 2007-10-22一的 14:28 +0800,怀宇范写道:
有个简单的模拟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;
不过,感觉就是拥有反射机制,也还是不如插件方的灵活的大,而且框架方的工作量增加,而插件方的工作量也不会有质的变化,毕竟那些必要的接口还是在
那。
基本上是我把框架接口暴露给插件,插件暴露实现一些必要的交互接口。互动中插件可以操作框架,这样灵活的比较大。
当然,这里讨论的跨语言的插件机制,我这里是不需要考虑的。
在 2007-10-22一的 14:28 +0800,怀宇范写道:
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的接口函数来实现, 接口的参数可以是函数对象的指针。
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;
> > > }- 隐藏被引用文字 -
>
> - 显示引用的文字 -
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/- 隐藏被引用文字 -
>
> - 显示引用的文字 -
另外,如果系统开放接口给插件,那么在一些场合下可能还需要考虑安全问题。从扩展性看,系统应开放尽可能多的接口,从安全性看,系统必须防止非法的插件
来访问系统避免造成破坏,或许我们可以采用数字签名等方式来验证插件的合法性,这样可行吗?不知大家有没有好的想法。
有时系统的层面不同,对安全性的要求也不一样。仅仅是辅助性的框架(像我上面的地图编辑器),一般对安全性的要求很弱(我做了些简单的assert契
约,有些约束甚至没检查)。如果是系统性的框架,那么对接口应该有严格调用检查、异常处理,避免因为插件质量影响框架本身。
不过,感觉要严格检查,有时简直要疯掉(我通常对new从来都懒得去处理失败的情况)。^_^
数字签名是乎只是约束了插件,而并没有解决系统本身的容错能力、权限控制。所以,如果要安全,还是要付出更多的逻辑代价。
我在上家公司做服务器时就对每客户端连接逻辑处理进行了严格的检查,虽然在之前,也进行过网络消息加密,连接校验。从实际实施来看,编码工作量并没有特
别大的改变,就是顺着逻辑,对逻辑前提进行校验。