Zásuvné moduly - pluginy

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

Zásuvné moduly tvorí a pouzívají spíse stredne pokrocilí programátori. Tuto kapitolu jsem sem umístil zejména proto, ze jsme na tuto problematiku narazili se studenty resícími své bakalárské projekty. Jak ale sami zjistíte, nejde o nic prílis slozitého.

Co to je zásuvný modul?

Jako zásuvný modul nebo plug-in se obvykle oznacuje knihovna, která rozsiruje funkcnost aplikace. Na rozdíl od obycejných knihoven, lze zásuvný modul zacít pouzívat za behu aplikace, aniz bychom ji museli znovu kompilovat. Zásuvné moduly lze vyvíjet i dlouho poté, co byla základní aplikace dokoncena.

Jak vytvorit zásuvný modul

Aby aplikace mohla pouzívat zásuvné moduly, musí je podporovat. To znamená, ze vývojár musí navrhnout a poskytnout rozhraní, pomocí kterého pujdou nové zásuvné moduly vytváret a pouzívat. Dále je potreba ríci, ze zásuvné moduly lze provozovat pouze v systémech, kde fungují dynamické knihovny. Aby mohla nejaká aplikace podporovat moduly, je dále typicky potreba, aby umela zpracovat nejaký druh konfiguracního souboru, ze kterého si bude schopna precíst jména a umístení souboru se zásuvnými moduly.

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

dlopen
Tato funkce otevre knihovnu podle zadaného jména a vrátí ukazatel na její popisovac. Pokud funkce vrátí nulu (prázdný ukazatel) znamená to, ze se jí knihovnu nepovedlo otevrít.
dlclose
Zavre otevrenou knihovnu a uvolní její popisovac. Funkce dlopen a dlclose jsou párové a platí pro ne totéz, co pro malloc-free nebo fopen-fclose.
dlerror
Vrací retezec s popisem poslední chyby nebo NULL.
dlsym
Slouzí k manipulaci s funkcemi, které jsou soucástí otevrené knihovny. Pomocí této funkce lze volat funkce. K prístupu do knihovny se pouzívá ukazatel na její popisovac.

Blizsí informace o jednotlivých funkcích najdete v manuálových stránkách. Najdete tam i ukázku pouzití. Pri linkování programu, který vyuzívá tyto funkce je potreba prilinkovat knihovnu dl. Dále se doporucuje pouzít prepínac -rdynamic.

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

Zásuvné moduly v C++

Zásuvné moduly lze tímto zpusobem vytváret jak v C, tak v C++. Pro vetsí zásuvné moduly doporucuji pouzít C++, protoze pak muzete rozhraní zásuvného modulu definovat jednoduse tak, ze v aplikaci vytvoríte vhodnou abstraktní trídu a do modulu umístíte jejího potomka. Kdyz pak pomocí dlsym vytvoríte objekt muzete pak jeho metody volat standardním zpusobem. Tento zpusob je nejenom mnohem elegantnejsí nez neustálé pouzívání funkce dlsym, ale urcite i mnohem efektivnejsí.

Problém v C++ spocívá v tom, ze funkce dlsym umí volat pouze céckové funkce. Volání metod v C++ je slozitejí. Není to vsak neprekonatelný problém. Protoze v nasem prípade potrebujeme vytvorit objekt, lze to udelat tak, ze povinnou soucástí kazdého zásuvného modulu bude obycejná funkce, která bude vyrábet práve námi pozadovaný objekt. Blizsí 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 vedet.