用 C++ 编写的文本编辑器插件系统
Posted
技术标签:
【中文标题】用 C++ 编写的文本编辑器插件系统【英文标题】:Plugin system for text editor writen in C++ 【发布时间】:2011-10-10 19:15:31 【问题描述】:我正在用 C++ 创建一个跨平台的文本编辑器。我想有一个非常基础的基础,然后通过插件实现所有功能。但是,不幸的是,我在设计插件系统方面一无所获。这通常是如何完成的?有人能指出我正确的方向吗?
不知道这是否重要,但我正在使用 wxWidgets 小部件套件。
【问题讨论】:
What's safe for a C++ plug-in system?的可能重复 您认为我的答案正确吗?愿意接受吗? 【参考方案1】:您可以从定义特定插件接口的基类开始,即:TextTransformPlugin,其方法采用字符串并返回字符串(虚拟)。
每个插件都将从该接口继承,并且您构建此类,例如:动态库(.so 文件)中的 SpanishTranslateTransformPlugin。
从您使用 dlopen 的程序打开库(请参阅 here 以获取 C++ 示例)。由于您无法调用类构造函数,因此在 so 库中您定义了一个标准函数(所有插件的名称相同,比如说 create() 并为其提供 C 调用约定,以便您可以使用 dlsym 获取符号并进行转换它到一个返回 TextTransformPlugin 的函数并调用它。
extern "C"
TextTransformPlugin * create(); // this would return new SpanishTranslateTransformPlugin
这样您将获得一个 TextTransformPlugin 对象,它是插件。由于接口方法是虚拟的,所以会调用具体的方法。
您必须注意插件的生命周期,将它们保存在注册表中。知道何时使用它们,最后销毁它们并关闭库。
请注意,Windows 没有 dlfcn.h,您可以在其中找到 dlopen。 LoadLibrary API 中有类似的功能,但您需要自己抽象平台。
如果您使用像 Qt 这样的多平台框架,您可以免费获得很多样板文件,并且可以在受支持的平台上运行。下面是一个可插入绘制应用程序的示例:
http://doc.qt.nokia.com/latest/tools-plugandpaint.html
正如您提到的,您正在使用 wxWidgets,这应该是照顾多个平台的等效功能:
http://docs.wxwidgets.org/2.8/wx_wxdynamiclibrary.html 和完整示例:http://wiki.wxwidgets.org/Programs_That_Support_Plugins
【讨论】:
【参考方案2】:Here 是您在互联网上可以找到的最佳主题
【讨论】:
以上是关于用 C++ 编写的文本编辑器插件系统的主要内容,如果未能解决你的问题,请参考以下文章