PIP 5.5.3
Platform-Independent Primitives
Открытые члены | Полный список членов класса
Класс PILibrary

Run-time библиотека. Подробнее...

#include <pilibrary.h>

Открытые члены

 PILibrary (const PIString &path_=PIString())
 Создает PILibrary и загружает если "path_" не пустой
 
 ~PILibrary ()
 Уничтожает PILibrary и выгружает библиотеку, если она была загружена
 
bool load (const PIString &path_)
 Загружает библиотеку по относительному или абсолютному пути "path_".
 
bool load ()
 Загружает библиотеку по пути path()
 
void unload ()
 Выгружает библиотеку, если она была загружена
 
void * resolve (const char *symbol)
 Получает экспортированный метод библиотеки с именем "symbol". Подробнее...
 
bool isLoaded () const
 Возвращает успешно ли загружена библиотека
 
PIString path () const
 Возвращает путь к библиотеке
 
PIString lastError () const
 Возвращает последнюю ошибку в читаемом виде
 

Подробное описание

Run-time библиотека.

Краткий обзор

PILibrary позволяет динамически загружать стороннюю библиотеку и использовать оттуда методы. Экземпляр PILibrary содержит указатель на библиотеку и выгружает её в деструкторе, поэтому рекомендуется создавать её с помощью new.

Основной метод PILibrary - это resolve(const char *), который возвращает void* указатель на запрошенный метод. Необходимо проверить его на nullptr и преобразовать в указатель на нужный метод.

В случае C++ библиотеки очень важно использовать C-linkage для экспортируемых методов! Также может понадобиться пометить методы на экспорт, например, __declspec(dllexport). Можно включить <piplugin.h> и использовать PIP_PLUGIN_EXPORT, чтобы пометить экспорт с помощью PIP.

extern "C" {
__declspec(dllexport) int exportedSum(int,int);
__declspec(dllexport) int exportedMul(int,int);
}

Использование

Библиотека:

#include <piplugin.h>
extern "C" {
PIP_PLUGIN_EXPORT int exportedSum(int,int);
PIP_PLUGIN_EXPORT int exportedMul(int,int);
}
int exportedSum(int a, int b) {
return a + b;
}
int exportedMul(int a, int b) {
return a * b;
}
Управление плагинами

Программа:

int main(int argc, char * argv[]) {
typedef int(*MyFunc)(int,int);
PILibrary * lib = new PILibrary();
if (lib->load("mylib.dll")) {
MyFunc fadd = (MyFunc)lib->resolve("exportedSum");
MyFunc fmul = (MyFunc)lib->resolve("exportedMul");
if (fadd) {
int sum = fadd(1, 2);
piCout << "sum =" << sum;
} else {
piCout << "Can`t resolve" << "exportedSum";
}
if (fmul) {
int mul = fadd(10, 20);
piCout << "mul =" << mul;
} else {
piCout << "Can`t resolve" << "exportedMul";
}
} else {
piCout << lib->lastError();
}
delete lib;
}
// sum = 3
// mul = 30
Run-time библиотека.
Definition: pilibrary.h:37
PILibrary(const PIString &path_=PIString())
Создает PILibrary и загружает если "path_" не пустой
Definition: pilibrary.cpp:135
#define piCout
Макрос для условного (piDebug) вывода в PICout(StdOut)
Definition: picout.h:35

Методы

◆ resolve()

void * PILibrary::resolve ( const char *  symbol)

Получает экспортированный метод библиотеки с именем "symbol".

Возвращает экспортированный метод с именем "symbol" из загруженной библиотеки. Метод должен иметь C-linkage и помечен для экспорта, согласно спецификации компилятора.
C-linkage не предоставляет информации о возвращаемом типе и аргументах, поэтому необходимо вручную преобразовать полученный указатель к формату требуемого метода перед вызовом.

Возвращает

void* указатель на метод или
nullptr если метод не существует или библиотека не загружена