PDA

Просмотр полной версии : Library class


SR_team
18.06.2017, 16:35
Написали с FYP'ом враппер для работы с библиотеками недавно, но мне все стыдно было его выкладывать, и вот сейчас я вроде как готов им поделиться, так что хватайте, пока не удалил.

Основная фичатость враппера - более удобное взаимодействие с библиотеками.

Бонусная плюшка - кроссплатформенность и кросскомпиляторность.

Теперь подробнее и интереснее.

Создавая экземпляр враппера можно не дописывать у названия библиотеки расширение - враппер сам его допишет в соответствии с платформой.

У враппера перегружены операторы [] и (), для подтягивания символов библиотек (аля GetProcAddress). Работают они примерно одинаково, только () указывает, что импортируемая функция имеет тип __stdcall.

Есть пара методов.

name() - возвращает чистое имя библиотеки (без пути и с расширением).

path() - возвращает путь к библиотеке, если он был указан в конструкторе.

handle()- возвращает указатель на адресное пространство библиотеки (аля GetModuleHandle).

hasSuccess() - возвращает инфу о наличии ошибок в загрузке библиотеки.

error() - возвращает ошибку в виде сообщения (т.е. она сразу прямым текстом вам напишет, что ей не нравится).

Где-то тут вы должны меня упрекнуть в оформлении документации, сославшись на то, что всё написанное выше - невнятная ***ня. По этому ниже рассмотрим примеры юзания.



Пример 1. Из своей либы тащим свою функцию:

C++:






#include
#include
#include "Library.h"
// Инициализируем враппер как глобальную переменную.
Library lib
=
"libtest.dll"
;
int
main
(
)
{
std
::
cout

f
=
lib
[
"getTest"
]
;
// Запускаем найденную функцию с аргументом 10 и сразу же выводим результат
std
::
cout



Вывод:

Код:





[CODE]
Hello world
100




Пример 2. Оставим код из примера 1, но удалим нашу библиотеку.

Вывод:

Код:






Hello world
The specified module could not be found.
Id: 126




Пример 3. Изменим код - подсосем системную библиотеку и вызове из нее __stdcall функцию

C++:






#include
#include
#include "Library.h"
Library lib
=
"kernel32.dll"
;
int
main
(
)
{
std
::
cout

f
=
lib
(
"GetTickCount"
)
;
std
::
cout



Вывод:

Код:





[CODE]
Hello world
Minutes after start the system: 17




Пример 4. Сравним наш враппер с HMODULE, а так же вызовем метод handle()

C++:






#include
#include
#include
#include "Library.h"
Library lib
=
"kernel32.dll"
;
int
main
(
)
{
std
::
cout

f
=
lib
(
"GetTickCount"
)
;
std
::
cout



Вывод:

Код:





[CODE]
Hello world
Minutes after start the system: 26




Пример 5. Срань (потому что без комментов) на линуксе.

C++:






#include
#include "Library.h"
Library lib
=
"./libtest"
;
int
main
(
int
argc
,
char
*
*
argv
)
{
std
::
cout

f
=
lib
[
"getTest"
]
;
std
::
cout



Вывод:

Код:





[CODE]
Hello, world!
289
libtest.so
./




Пример 6. Срань с линукса на винде (в код добавлен _getch() что бы консолька не закрывалась, а в остольном точно такой же)

C++:






#include
#include
#include "Library.h"
Library lib
=
"./libtest"
;
int
main
(
int
argc
,
char
*
*
argv
)
{
std
::
cout

f
=
lib
[
"getTest"
]
;
std
::
cout



Вывод:

Код:





[CODE]
Hello, world!
289
libtest.dll
./




Пример 7. Возвращаемся к срани на линуксе, но теперь удаляем нашу либу (что бы показать какие ошибки там). Код из 5 примера.

Вывод:

Код:






Hello, world!
./libtest.so: cannot open shared object file: No such file or directory

iAmerican
18.06.2017, 17:07
из SF можно функции тащить?

SR_team
18.06.2017, 17:39
из SF можно функции тащить?


тащи