HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
 
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 18.06.2017, 16:35
SR_team
Флудер
Регистрация: 26.10.2013
Сообщений: 4,924
С нами: 6603505

Репутация: 183


По умолчанию

Написали с 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


 
Ответить с цитированием
 





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.