用 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++ 编写的文本编辑器插件系统的主要内容,如果未能解决你的问题,请参考以下文章

最好用的web端代码文本编辑器ACE

百度富文本编辑器支持从word复制粘贴保留格式和图片的插件

tinymce 富文本编辑器 编写资料

用VC写了一个文本编辑器,怎样将输入里面的关键字变色实现高亮状态,就像在VC里面写代码输入C++关键字那样

如何用C#编写文本编辑器

Notepad++文本编辑器