当前位置:  开发笔记 > 编程语言 > 正文

用C或C++实现插件系统

如何解决《用C或C++实现插件系统》经验,为你挑选了5个好方法。

有关实现插件样式系统的提示有哪些?



1> unwind..:

在C(我也认为C++,虽然我自己没有这样做),这通常是使用动态加载的模块完成的.这些API依赖于平台.

在POSIX(Linux)上,您可以使用dlopen()函数族.基本上你是单独构建你的插件,然后在运行时加载它,按名称查找它的符号,然后可以调用它们.

对于Win32,有LoadLibrary()一些非常类似的东西,你将代码构建到DLL中.

对于一个方便的包装,使所有这些容易和透明,请查看GLib的GModule API.


围绕整个混乱的另一个包装是Qt的插件系统.它完成所有幕后操作,允许您安全地从模块加载C++内容.

2> RogerV..:

在'92/'93时间框架中,我研究了Aldus PageMaker的插件架构,该架构采用C++编码.PageMaker建立在一个名为VAMP的C++ OOP框架上,它支持Mac OS和Windows之间的可移植性.

所以我们尝试使用C++的特性来构建插件架构.由于所谓的脆弱基类问题,这证明对于C++类来说是非常有问题的.我接着写了一篇发表在期刊上的论文,并在OOPSLA '93的反思研讨会上发表了论文.我还在波特兰的Usenix会议上与Bjarne Stroustrup联系,并与他进行了几个月的对话,在那里他主张代表我处理脆弱的基类问题.(唉,当时其他问题被认为更重要.)

微软推出了COM/DCOM系统,并为该平台提供了可行的解决方案.通过用于定义COM接口的抽象类,C++可以用作COM的实现语言.

然而,这些天开发人员避开了COM/DCOM.

相比之下,NeXT在NeXT Step框架中使用Objective C在90年代早期设计了一个插件架构.如今,苹果计算机和重要平台(如iPhone)上的Mac OS X中充满活力.

我提交的Objective C能够以出色的方式解决插件问题.

我个人认为C++的脆弱基类问题是最致命的缺陷.

如果使用基于C语言的语言系列构建插件架构,可以使用Objective C来实现.


我现在写了一篇博文来总结这一切:17年后修复C++运行时可扩展性为时已晚?http://humbleblogger.blogspot.com/2009/04/after-17-years-is-it-too-late-to-fix-c.html

3> AshleysBrain..:

我能给出的最佳平台和语言中立建议如下:

围绕插件SDK设计整个应用程序.

IMO,一个插件SDK不应该是事后的想法.如果您将应用程序设计为基本上是一个加载插件的空壳,那么核心功能将在您自己的SDK中实现,您将获得以下好处:

高度模块化的组件,明确的目的分离(这有助于您的架构变得更好)

它会强制你的SDK非常好用

它允许其他第三方开发人员制作极其强大的核心级功能

新的开发人员/雇员可以轻松地开始处理主要的新功能,而无需触摸主应用程序 - 他们可以在插件中完成所有工作(这可以防止他们搞砸其他任何东西)

在C/C++中,您可能使用动态链接库以及函数指针(C)或接口(仅由纯虚方法组成的类,用于C++).但即使您使用Javascript,我仍然会推荐上述架构.



4> Chris Lutz..:

这可能不是您正在寻找的,但您可以在您的应用程序中嵌入脚本语言,例如Lua.Lua旨在嵌入其他程序中,并用作编写插件的脚本语言.我相信将Lua解释器添加到您的程序中相当容易,但我不知道Lua所以我不能保证解决方案的效果如何.对Lua有更多经验的其他人,请添加关于将Lua嵌入另一个应用程序的经验的评论.

当然,这意味着你的插件需要用Lua编写.如果您不喜欢Lua,那么事实上的标准Perl,Python和Ruby解释器都是用C语言编写的,并且可以嵌入到C程序中.我知道有许多程序使用这些语言作为脚本语言扩展.

但是,我不知道你在寻找什么,因为你的问题有点模糊.也许有关您希望人们能够使用所述插件做什么的更多信息是合适的.对于某些任务,完整的脚本语言可能有点矫枉过正.



5> 小智..:

Qt提供QPluginLoader:http://qt-project.org/doc/qt-4.8/qpluginloader.html

如果您需要/想要更细粒度的控制,Qt还提供了一种使用QLibrary动态加载库的方法:http: //qt-project.org/doc/qt-4.8/qlibrary.html

更好的是,它们可跨平台移植.

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有