Dynamic loading of modules

Короткий опис

Ці функції забезпечують стерпний спосіб динамічного завантаження об'єктних файлів (відомі як 'plug-ins'). Поточна реалізація підтримує всі системи які забезпечують виконання dlopen () (наприклад Linux / Sun), а також HP-UX через механізм shl_load () і Windows через DLLs.

Програми які передбачається використовувати з цими функціями повинні бути слінковани з бібліотеками виведення (output) за допомогою команди pkg-config --libs gmodule-2.0.

Для їх використання ви спочатку повинні визначити чи підтримується динамічне завантаження на використовуваної платформі за допомогою виклику g_module_supported (). Якщо підтримується, то ви можете відкривати модулі за допомогою g_module_open (). шукати модульні ідентифікатори (наприклад імена функцій) за допомогою g_module_symbol (). а потім закривати модулі за допомогою g_module_close (). g_module_name () повертає ім'я файлу поточного відкритого модуля.

Якщо будь-яка з описаних вище функцій завершується невдачею, опис помилки можна знайти за допомогою g_module_error ().

GModule реалізує особливість підрахунку посилань для відкритих модулів і підтримку функцій обробки переривань в модулі, яка викликається коли модуль завантажується і вивантажується (дивіться GModuleCheckInit і GModuleUnload).

Якщо ваш модуль вводить статичні дані для загальних підсистем в виконуваної програмою, наприклад через виклик g_quark_from_static_string ( "my-module-stuff"). він повинен бути впевнений що ніколи не вивантажиться за допомогою виклику g_module_make_resident ().

Приклад 12. Calling a function defined in a GModule

g_module_build_path ()

Стерпний спосіб створення імені файлу модуля. Від платформи специфічні префікс і суфікс додаються для імені файлу, якщо необхідно і результат додається в каталог, використовуючи правильний символьний роздільник.

Параметр directory повинен визначати каталог де де може бути знайдений модуль. Він може бути NULL або символом нового рядка вказуючи що модуль знаходиться в стандартному від платформи залежному каталозі, хоча це не рекомендується, так як може бути знайдений неправильний модуль.

Наприклад, виклик g_module_build_path () в системі Linux з параметром directory рівним значенню / lib і параметром module_name рівним значенню "mylibrary" поверне /lib/libmylibrary.so. В системі Windows, використання \ Windows як значення параметра directory поверне \ Windows \ mylibrary.dll.

каталог де знаходиться модуль. Може бути NULL або символом нового рядка вказуючи що використовується стандартний платформо-залежний каталог, хоча це не рекомендується.

абсолютний шлях модуля, включаючи стандартний бібліотечний префікс і суфікс. Повинен звільнятися коли більше не потрібен.

g_module_open ()

Відкриває модуль. Якщо модуль вже відкритий, то збільшує кількість посилань.

Перш за все g_module_open () намагається відкрити file_name як модуль. Якщо це не вдається і file_name має суфікс ".la" (і є архів libtool), вона пробує відкрити відповідний модуль. Якщо зазнає невдачі і він не має належного суфікса модуля для платформи (G_MODULE_SUFFIX), цей суфікс буде приставлений і відповідний модуль буде відкритий. Якщо це не вдається і file_name не має суфікса ".la", цей суфікс підставляється і g_module_open () намагається відкрити відповідний модуль. Якщо і це не вдається, то повертається NULL.

ім'я файлу містить модуль, або NULL для отримання GModule представляє безпосередньо основну програму.