![]() |
PIP 5.5.3
Platform-Independent Primitives
|
Загрузчик плагина. Подробнее...
#include <piplugin.h>
Открытые типы | |
| enum | Error { Unknown , NoError , NoSuchFile , LibraryLoadError , MissingSymbols , InvalidLoaderVersion , InvalidUserVersion } |
| Возможные ошибки загрузки плагина Подробнее... | |
Открытые члены | |
| PIPluginLoader (const PIString &name=PIString()) | |
| Создает загрузчик с базовым именем файла "name" и вызывает load() если "name" не пустое | |
| ~PIPluginLoader () | |
| Деструктор, выгружает библиотеку | |
| bool | load (const PIString &name) |
| Загружает плагин с базовым именем "name". Подробнее... | |
| void | unload () |
| Выгружает плагин и освобождает библиотеку | |
| bool | isLoaded () const |
| Возвращает успешно ли загружен плагин | |
| Error | lastError () const |
| Возвращает ошибку последнего вызова load() | |
| PIString | lastErrorText () const |
| Возвращает сообщение об ошибке последнего вызова load() | |
| void | setMessages (bool yes) |
| Устанавливает должен ли PIPluginLoader выводить сообщения, true по умолчанию | |
| bool | isMessages () const |
| Возвращает должен ли PIPluginLoader выводить сообщения, true по умолчанию | |
| PIString | libPath () |
| Возвращает путь к загруженной библиотеке | |
| void * | resolve (const char *name) |
| Получает экспортированный метод библиотеки с именем "symbol". Подробнее... | |
| void | mergeStatic () |
| Вызывает у плагина PIP_PLUGIN_STATIC_SECTION_MERGE. | |
Относящиеся к классу функции | |
(не члены класса) | |
| #define | PIP_PLUGIN |
| Объявляет плагин, должен быть использован перед любыми другими PIP_PLUGIN_* макросами | |
| #define | PIP_PLUGIN_SET_USER_VERSION(version) |
| Устанавливает пользовательскую версию для проверки во время загрузки, "version" - строка в кавычках | |
| #define | PIP_PLUGIN_ADD_STATIC_SECTION(type, ptr) |
| Добавляет указатель для будущего слияния. Тип - целое число | |
| #define | PIP_PLUGIN_STATIC_SECTION_MERGE |
| Объявляет метод для слияния статических секций Подробнее... | |
| #define | PIP_PLUGIN_EXPORT |
| Пометить метод на экспорт | |
Загрузчик плагина.
Этот файл предоставляет несколько макросов для объявления плагина и PIPluginLoader - класс для его загрузки и проверки.
Плагин - это разделяемая библиотека, которая может быть загружена динамически. Необходимым является только макрос PIP_PLUGIN. Можно установить версию для дополнительной проверки с помощью макроса PIP_PLUGIN_SET_USER_VERSION(version). Также можно объявить метод для слияния статических секций между приложением и плагином с помощью макроса PIP_PLUGIN_STATIC_SECTION_MERGE. Перед слиянием необходимо установить указатели для секций с помощью макроса PIP_PLUGIN_ADD_STATIC_SECTION(type, ptr).
Приложение должно использовать класс PIPluginLoader для загрузки плагина. Основной метод - это load(PIString name). "name" является базовым именем для поиска библиотеки. PIPluginLoader попробует несколько имен, <name>, lib<name> и расширения "dll", "so" и "dylib", в зависимости от системы.
Например:
На Windows будут опробованы "foo", "libfoo", "foo.dll" и "libfoo.dll".
Если нужна проверка пользовательской версии, установите ей с помощью макроса PIP_PLUGIN_SET_USER_VERSION(version). Когда плагин будет успешно загружен и проверен, можно будет получать из него свои методы с помощью resolve(name), аналогично PILibrary.
Макрос PIP_PLUGIN_STATIC_SECTION_MERGE объявляет метод с аргументами (int type, void * from, void * to), поэтому можно оставить его как объявление, или реализовать тут же:
В любом случае, если используется макрос PIP_PLUGIN_STATIC_SECTION_MERGE, то он вызывается первый раз во время загрузки плагина с "from" - областью плагина, "to" - областью приложения, и второй раз (необязательно) при вызове mergeStatic() с "from" - областью приложения и "to" - областью плагина.
Первый вызов позволяет скопировать статические секции из плагина в приложение, второй - из приложения (и всех остальных плагинов) в плагин.
Простой плагин:
Приложение:
Сложный плагин:
Приложение:
Возможные ошибки загрузки плагина
| Элементы перечислений | |
|---|---|
| Unknown | Не было вызова load() |
| NoError | Нет ошибки |
| NoSuchFile | Не найден файл библиотеки |
| LibraryLoadError | Система не смогла загрузить библиотеку |
| MissingSymbols | Нет необходимых методов |
| InvalidLoaderVersion | Неверная внутренняя версия |
| InvalidUserVersion | Неверная пользовательская версия |
| bool PIPluginLoader::load | ( | const PIString & | name | ) |
Загружает плагин с базовым именем "name".
Загрузчик пробует приставку "lib" и окончания ".dll", ".so" или ".dylib", в зависимости от системы
| void * PIPluginLoader::resolve | ( | const char * | name | ) |
Получает экспортированный метод библиотеки с именем "symbol".
|
related |
Объявляет метод для слияния статических секций
Этот метод имеет 3 аргумента: (int type, void * from, void * to). Он вызывается первый раз при загрузке плагина с "from" - областью плагина, "to" - областью приложения, и второй раз (необязательно) при вызове PIPluginLoader::mergeStatic() с "from" - областью приложения и "to" - областью плагина. Таким образом, этот макрос позволяет провести слияние статических данных приложения и плагина.