Подтвердить что ты не робот

Что лучший способ написать плагируемое приложение?

Я хочу написать собственное приложение, которое может быть расширено с помощью плагинов, perferabily в виде динамических библиотек. У меня есть идея, что делать, но мне хотелось бы получить некоторые идеи, особенно советы по лучшей практике, что делать и не делать. Я работал с подобными вещами на java и php, поэтому надеюсь, что не принесу вредных привычек на мой С++.

Я имею в виду позволить разработчикам реализовать определенные функции, такие как "on_recieve_data (App * app, void * data)", и мое приложение загрузит все плагины и вызовет их функцию on_recieve_data указателем на себя (dlsym?).

4b9b3361

Ответ 1

Есть несколько вещей, которые я считаю очень важными для плагинов:

  • Поддержка языков

Если вы хотите достичь наибольшего числа платформ/языков/компиляторов, тогда вы должны написать интерфейс плагина на C, а не на С++. Разработчики плагинов все еще могут писать свои функции на С++, конечно, это просто интерфейс, который является C. Проблема заключается в том, что каждый компилятор С++ управляет именами символов по-своему, поэтому, если вы используете С++, вы будете принуждать разработчиков плагинов к используйте те же компиляторы и инструменты, которые вы используете. С другой стороны, существует только один способ экспорта символов C, поэтому использование C-интерфейса для плагина позволит разработчикам выбирать любые инструменты, которые им нравятся, и пока они могут создавать стандартные библиотеки .so/.dll, они будут быть в порядке.

  • Распределение памяти

На некоторых платформах возникают проблемы, когда память, выделенная приложением, освобождается DLL или наоборот. Если плагин имеет функции, которые должны распределять память, то убедитесь, что вы также нуждаетесь в том, чтобы плагин предоставлял соответствующую функцию для освобождения этой памяти. Аналогично, если плагин может вызывать функцию в приложении для выделения памяти, вы также должны выставить функцию освобождения для этой памяти.

  • Versioning

Вероятно, вам придется пересмотреть API-интерфейс плагина после написания плагинов. Поэтому ваша заявка должна быть подготовлена ​​для загрузки плагинов, разработанных для более старой версии. Вы должны потребовать функцию "init" в плагине, которую приложение вызывает, чтобы определить, какую версию API реализует плагин, и любую другую информацию, которая может понадобиться для приложения, например тип плагина (если есть разные типы), что реализовано, а что нет, и т.д.

Также вы должны быть очень осторожны, когда вам придется пересмотреть API-интерфейс плагина. Вы не можете изменять существующие функции, так как это нарушит старые плагины. Вместо этого вам нужно будет добавить альтернативные версии тех функций, которые имеют улучшения. Затем возникает проблема, как назвать новую версию существующей функции. Обычно они получат одно и то же имя плюс некоторый суффикс ( "Ex", число и т.д.). Я не видел, чтобы эта проблема была решена так, как мне нравится.

Аналогичным образом, вы должны принять меры предосторожности для структур, которые передаются между приложением и плагинами. Общий подход состоит в том, чтобы сделать первый член всех структур размером структуры. Это работает как механизм управления версиями, так что приложение может определить, как выглядит структура по своему размеру.

Вот несколько ссылок, которые могут представлять интерес:

  • C-Pluff, универсальная плагиновая платформа в C (лицензия MIT)
  • lighttpd plugin.h заголовочный файл
  • На этой странице обсуждается, как реализовать плагиновую архитектуру в Mac OS X, включая краткий обзор того, как создать C интерфейс для плагинов.
  • Blender является интересным. Приложение написано на С++, но плагины написаны на Python. Неплохая идея на самом деле, разработчику гораздо проще писать плагины.

Существует множество приложений, написанных на языках сценариев, поддерживающих плагины (Wordpress, Drupal, Django и многие другие). Вы можете посмотреть на любой из тех, которые ближе к тому типу приложений, которые вы пишете для идей.