ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Library class (https://forum.antichat.xyz/showthread.php?t=1317181)

SR_team 18.06.2017 16:35

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

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

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

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

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

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

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

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

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

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

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

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

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

Цитата:

Сообщение от Спойлер

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

C++:





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

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



Вывод:

Код:





Код:

Hello world
100



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

Вывод:

Код:





Код:

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



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

C++:





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

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



Вывод:

Код:





Код:

Hello world
Minutes after start the system: 17



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

C++:





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

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



Вывод:

Код:





Код:

Hello world
Minutes after start the system: 26



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

C++:





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

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



Вывод:

Код:





Код:

Hello, world!
289
libtest.so
./



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

C++:





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

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



Вывод:

Код:





Код:

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

Цитата:

Сообщение от iAmerican

из SF можно функции тащить?

тащи


Время: 04:22