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

时间:2011-10-10 19:15:31

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

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

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

2 个答案:

答案 0 :(得分:3)

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

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

从程序中使用dlopen打开库(有关C ++示例,请参阅here)。因为你不能调用类构造函数,所以在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

答案 1 :(得分:0)

Here是您在互联网上找到的最佳主题