Zásuvné moduly - pluginy

[  Co to je zásuvný modul?  |  Jak vytvořit zásuvný modul  |  Zásuvné moduly v C++  ]

Zásuvné moduly tvoří a používají spíše středně pokročilí programátoři. Tuto kapitolu jsem sem umístil zejména proto, že jsme na tuto problematiku narazili se studenty řešícími své bakalářské projekty. Jak ale sami zjistíte, nejde o nic příliš složitého.

Co to je zásuvný modul?

Jako zásuvný modul nebo plug-in se obvykle označuje knihovna, která rozšiřuje funkčnost aplikace. Na rozdíl od obyčejných knihoven, lze zásuvný modul začít používat za běhu aplikace, aniž bychom ji museli znovu kompilovat. Zásuvné moduly lze vyvíjet i dlouho poté, co byla základní aplikace dokončena.

Jak vytvořit zásuvný modul

Aby aplikace mohla používat zásuvné moduly, musí je podporovat. To znamená, že vývojář musí navrhnout a poskytnout rozhraní, pomocí kterého půjdou nové zásuvné moduly vytvářet a používat. Dále je potřeba říci, že zásuvné moduly lze provozovat pouze v systémech, kde fungují dynamické knihovny. Aby mohla nějaká aplikace podporovat moduly, je dále typicky potřeba, aby uměla zpracovat nějaký druh konfiguračního souboru, ze kterého si bude schopna přečíst jména a umístění souborů se zásuvnými moduly.

Pro práci se zásuvnými moduly slouží následující funkce se systémové knihovny, které jsou obsaženy v rozhraní dlfcn.h:

dlopen
Tato funkce otevře knihovnu podle zadaného jména a vrátí ukazatel na její popisovač. Pokud funkce vrátí nulu (prázdný ukazatel) znamená to, že se jí knihovnu nepovedlo otevřít.
dlclose
Zavře otevřenou knihovnu a uvolní její popisovač. Funkce dlopen a dlclose jsou párové a platí pro ně totéž, co pro malloc-free nebo fopen-fclose.
dlerror
Vrací řetězec s popisem poslední chyby nebo NULL.
dlsym
Slouží k manipulaci s funkcemi, které jsou součástí otevřené knihovny. Pomocí této funkce lze volat funkce. K přístupu do knihovny se používá ukazatel na její popisovač.

Bližší informace o jednotlivých funkcích najdete v manuálových stránkách. Najdete tam i ukázku použití. Při linkování programu, který využívá tyto funkce je potřeba přilinkovat knihovnu dl. Dále se doporučuje použít přepínač -rdynamic.

$ gcc -std=c99 -pedantic -Wall -rdynamic -ldl program.c -o program

Zásuvné moduly v C++

Zásuvné moduly lze tímto způsobem vytvářet jak v C, tak v C++. Pro větší zásuvné moduly doporučuji použít C++, protože pak můžete rozhraní zásuvného modulu definovat jednoduše tak, že v aplikaci vytvoříte vhodnou abstraktní třídu a do modulu umístíte jejího potomka. Když pak pomocí dlsym vytvoříte objekt můžete pak jeho metody volat standardním způsobem. Tento způsob je nejenom mnohem elegantnější než neustálé používání funkce dlsym, ale určitě i mnohem efektivnější.

Problém v C++ spočívá v tom, že funkce dlsym umí volat pouze céčkové funkce. Volání metod v C++ je složitějí. Není to však nepřekonatelný problém. Protože v našem případě potřebujeme vytvořit objekt, lze to udělat tak, že povinnou součástí každého zásuvného modulu bude obyčejná funkce, která bude vyrábět právě námi požadovaný objekt. Bližší informace o této problematice najdete v dokumentu "C++ dlopen mini HOWTO".


Autor: David Martinek. Poslední modifikace: 24. October 2010. Pokud v tomto dokumentu narazíte na chybu, dejte mi prosím vědět.