我正在用 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/