Система плагинов для текстового редактора, написанного на C ++ - PullRequest
0 голосов
/ 10 октября 2011

Я создаю кроссплатформенный текстовый редактор на C ++. Я хотел бы иметь очень базовую базу, а затем реализовать все функции с помощью плагинов. Но, к сожалению, я ничего не могу сделать при разработке системы плагинов. Как это обычно делается? Может ли кто-нибудь указать мне правильное направление?

Не знаю, имеет ли это значение, но я использую набор виджетов wxWidgets.

Ответы [ 2 ]

3 голосов
/ 10 октября 2011

Вы можете начать с базового класса, определяющего конкретный интерфейс плагина, а именно: TextTransformPlugin, с методом, принимающим строку и возвращающим строку (виртуальную).

Каждый плагин наследовал бы от этого интерфейса, и вы создаете этот класс, например: SpanishTranslateTransformPlugin в динамической библиотеке (.so файл).

Из программы вы используете dlopen, чтобы открыть библиотеку (см. здесь для примера C ++). Поскольку вы не можете вызвать конструктор класса, в библиотеке so вы определяете стандартную функцию (одно и то же имя для всех плагинов, скажем, create () и присваивает ей соглашения о вызовах C, чтобы затем вы могли использовать dlsym для получения символа и приведения это функция, возвращающая TextTransformPlugin и вызывающая его.

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

Таким образом, вы получите объект TextTransformPlugin, который является плагином. Поскольку методы интерфейса являются виртуальными, будут вызваны конкретные методы.

Вам нужно будет позаботиться о жизненном цикле плагина, сохраняя его в реестре. Знать, когда их использовать, и, наконец, уничтожить их и закрыть библиотеки.

Обратите внимание, что в Windows нет dlfcn.h, где вы найдете dlopen. В API LoadLibrary есть аналогичные функциональные возможности, но вам придется самостоятельно абстрагировать платформы.

Если вы используете многоплатформенный фреймворк, такой как 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

0 голосов
/ 25 октября 2011

Здесь - лучшая тема в Интернете

...