Точка инициализации модуля плагина
Когда диспетчер плагинов загружает модуль плагина, он вызывает процедуруинициализации модуля — единственную экспортируемую функцию плагинаFB_PLUGIN_ENTRY_POINT
. Для написания кода ей понадобятся две глобальныепеременные — модуль плагина и фабрика плагинов. В нашем случае это:
PluginModule module;
Factory factory;
Если модуль содержит более одного плагина, вам понадобится фабрика длякаждого плагина.
Для FB_PLUGIN_ENTRY_POINT
мы не должны забывать, что она должна бытьэкспортирована из модуля плагина, для этого требуется учет некоторыхособенностей ОС. Мы делаем это, используя макрос FB_DLL_EXPORT
,определенный в examples/interfaces/ifaceExamples.h
. Если вы уверены,что используете плагин только для некоторых конкретных ОС, то вы можетесделать это место немного проще. В минимальном случае функция должнарегистрировать модуль и все фабрики в диспетчере плагинов:
extern "C" void FB_DLL_EXPORT FB_PLUGIN_ENTRY_POINT(IMaster* master)
{
IPluginManager* pluginManager = master->getPluginManager();
module.registerMe(pluginManager);
pluginManager->registerPluginFactory(IPluginManager::TYPE_DB_CRYPT,
"DbCrypt_example",
&factory);
}
Прежде всего, мы вызываем недавно написанную нами функциюPluginModule::registerMe()
, которая сохраняет IPluginManager
длядальнейшего использования и регистрирует наш модуль плагина. Затемрегистрируем фабрику (или фабрики если в одном модуле будет несколькоплагинов). Мы должны передать правильный тип плагина (допустимые типыперечислены в интерфейсе IPluginManager
) и имя, под которым будетзарегистрирован плагин. В простейшем случае он должен совпадать с именемдинамической библиотеки модуля плагина. Это правило поможет вам ненастраивать плагин вручную в plugins.conf
.
Обратите внимание — в отличие от приложений плагины не должныиспользовать fb_get_master_interface()
для получения IMaster
. Вместоэтого следует использовать экземпляр, переданный вFB_PLUGIN_ENTRY_POINT
. Если вам нужен мастер-интерфейс в вашем плагине,позаботьтесь об его сохранении в этой функции.