c++ - 用 C++ 编写的文本编辑器插件系统

标签 c++ plugins cross-platform wxwidgets text-editor

我正在用 C++ 创建跨平台文本编辑器。我想有一个非常基本的基础,然后通过插件实现所有功能。但是,不幸的是,我在设计插件系统方面一事无成。这通常是如何完成的?有人可以指出我正确的方向吗?

不知道这是否重要,但我正在使用 wxWidgets 小部件工具包。

最佳答案

您可以从定义特定插件接口(interface)的基类开始,即:TextTransformPlugin,使用一个方法获取一个字符串并返回一个字符串(虚拟)。

每个插件都将从该接口(interface)继承,您可以在动态库(.so 文件)中构建此类,例如:SpanishTranslateTransformPlugin。

从您使用 dlopen 打开库的程序中(有关 C++ 示例,请参见 here)。因为你不能调用类构造函数,所以在 so 库中你定义了一个标准函数(所有插件的名称都相同,比如说 create() 并给它 C 调用约定,这样你就可以使用 dlsym 来获取符号并进行转换将其传递给返回 TextTransformPlugin 的函数并调用它。

extern "C" {
    TextTransformPlugin * create(); // this would return new SpanishTranslateTransformPlugin
}

这样您将获得一个 TextTransformPlugin 对象,它是插件。由于接口(interface)方法是虚拟的,因此将调用具体方法。

您必须注意插件的生命周期,将它们保存在注册表中。知道何时使用它们,并最终销毁它们并关闭库。

请注意,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

关于c++ - 用 C++ 编写的文本编辑器插件系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7717490/

相关文章:

c++ - {object} 的类型是什么?

c++ - 如何在 Qt 5.2 中将 QTcpSocket 传递给 QRunnable

java - 下载旧版本的 SonarQube Java 插件

javascript - 摘抄();函数不计算/处理日语单词

c++ - 通过linux终端将数据发送到另一个进程的stdin

c++ - < & > 被转换为 > < 等

C#、MEF - 签署受信任的插件以减少滥用

java-me - System.getProperty ("line.separator")在 j2me 中等效

unix - OS X 对 *nix 开发人员的吸引力?

linux - 根据操作系统运行 Node.js