[C++] Создание библиотек
|
|
DexT3R |
Дата: Воскресенье, 17.11.2013, 22:40 | Сообщение # 1
|
(•̪●)=ε/̵͇̿̿/’̿’̿ ̿ ̿̿ ̿ ̿””
Сообщений: 1978
Статус: Offline
|
Всем привет с вами Kukushka!! И сегодняшний урок будет посвящен dll библиотекам.
Приступим: Что же такое "библиотека"? Библиотекой называют файлы типа ".dll" Более углубленный ответ будет:
DLL (англ. dynamic-link library — «библиотека динамической компоновки», «динамически подключаемая библиотека») в операционных системах Microsoft Windows и IBM OS/2 — динамическая библиотека, позволяющая многократное использование различными программными приложениями. K DLL относятся также элементы управления ActiveX и драйверы. В мире UNIX аналогичные функции выполняют так называемые общие объекты.
Ну или для новичков: Библиотека - это набор функций. Вроде все обьяснил приступим В этом уроке мы напишем простейшую библиотеку на С++ и используем её в Cleo-скрипте.
1. Начнем с написания. Писать библиотеку я буду на Visual Studio 2012. Для этого, откроем новый проект и укажем тип проекта: Указывает шаблон Консольное приложение Win32, тип проекта - Win32. Вводим имя проекта и нажимаете ОК. После чего в нас появиться диалоговое окно такого типа: Выбираем DLL, и ставим галочку на пустой проект, после чего нажимаем кнопку Готово. Программа создала нам 3 папки: Заголовочные файлы, Файлы исходного кода и Файлы ресурсов. Выбираем папку "Файлы исходного кода", нажимаем ПКМ и выбираем опцию Добавить > Создать элемент: В появившемся окне выбираем Код > Файл CPP. В поле ИМЯ мы даём название нашему исходному файлу: Когда данные заполнены, нажимаем Добавить. Перед нами пустой проект. Здесь мы будем писать код библиотеки. Все функции должны быть экспортными, по этому перед каждой из них мы должны написать код: Код extern "C" __declspec(dllexport) Используя язык С++, мы напишем простенькую функцию, которая будет возвращать нам сумму 3-х целых чисел. Мой код такой: int plus(int a, int b, int c){ return a+b+c; } Всё, что остаётся - дописать код эксторта и подключить стандартную библитеку iostream: #include <iostream>
extern "C" __declspec(dllexport) int plus(int a, int b, int c){ return a+b+c; } Теперь скомпилируем код, нажав на конку дебага или клавишу F5!
Нам осталось скопировать нашу DLL в папку с игрой. Я, например, кину её в папку Cleo:
Все осталась финальная часть: 2. Теперь берём в руки наш любимый Sanny Builder и будем писать код Для начала. рассмотрим опкоды, которые работают DLL-библиотекой: 0AA2: 0@ = load_library "CLEO\Kukushka.dll" // IF and SET Опкод загружает библиотеку в память. Здесь: 0@ — имя загруженной библиотеки "CLEO\Kukushka.dll" - путь с самой DLL-ке. 0AA3: free_library 0@
Опкод выгружает ранее загруженную библиотеку из памяти. ВАЖНО! Библиотеку нужно ВСЕГДА выгружать из памяти после использования. Здесь: 0@ — имя загруженной библиотеки
0AA4: 1@ = get_proc_address "plus" library 0@ // IF and SET Получить адрес функции. Здесь: 0@ — имя загруженной библиотеки "plus" - имя фунции 1@ - в переменную заносится адрес функции
0AA7: call_function 1@ num_params 3 pop 3 _a= 3 _b= 4 _c=5 store_to 2@
Опкод выполняет функцию по адресу. Здесь: 1@ - адрес функции num_params 3 - количество параметров, передаваемых в функцию. Так, как наша библиотека принимает 3 параметра, то число будет тоже 3. Следует учесть, что это "плавающий" параметр и количество зависит от самих функций. pop 3 - количество параметров, которых нужно очистить после использования функции. Этот параметр обычно совпадает с к-вои передаваемых параметров. _a= 3 _b= 4 _c= 5 - перечисление параметров, которые будут переданы в функцию. К-во должно строго совпадать с к-вом параметров в нашей dll-ке. В нашем случаи мы передадим числа 3, 4 и 5. 2@ - переменная, в которую будет возвращено значение. В нашем случае эта переменная необходимая, но если функция ничего не возвращает, то поле остаётся пустым. Следует обратить внимание, что этот опкод выполняет функции не только DLL-библиотек, но и GTA'шные функции. Код {$CLEO} 0000:
:MyDLL thread 'MyDLL' wait 5000 if 0AA2: 0@ = load_library "CLEO\Kukushka.dll" // IF and SET jf @MyDLL_END_1 if 0AA4: 1@ = get_proc_address "plus" library 0@ // IF and SET jf @MyDLL_END_2 $PARAM_1 = 3 $PARAM_2 = 5 0AA7: call_function 1@ num_params 3 pop 3 $PARAM_1 $PARAM_2 10 result_to $RES 0ACE: show_formatted_text_box "Summ: %d" $RES 0AA3: free_library 0@ jump @MyDLL_END
:MyDLL_END_1 wait 0 0ACE: show_formatted_text_box "FILE NOT FOUND" jump @MyDLL_END
:MyDLL_END_2 wait 0 0ACE: show_formatted_text_box "ADDRESS NOT FOUND"
:MyDLL_END wait 0 0A93: end_custom_thread
Проверяем! Нам должно вывести число 12, то есть, наша функция работает без проблем!
Всем пока с вами был Kukushka. До скорых встреч
НИЧЕГО НЕ ПРОДАЮ В ТЕЛЕГРАММЕ И ВК!!
Сообщение отредактировал Kukushka - Понедельник, 18.11.2013, 01:22 |
|
|
|
[CM]BzzPerfect |
Дата: Воскресенье, 19.01.2014, 14:53 | Сообщение # 2
|
Боец
Сообщений: 147
Статус: Offline
|
Как же всё сложно
|
|
|
|
danya777_kirov |
Дата: Понедельник, 20.01.2014, 19:38 | Сообщение # 3
|
Бывалый
Сообщений: 347
Статус: Offline
|
ой чеэт)))))))
помогаю по пхп хтмл в лс писать <br\> верстаю сайты в лс тоже помог ставь +++ в репку
|
|
|
|
[CM]Purix |
Дата: Воскресенье, 26.01.2014, 12:14 | Сообщение # 4
|
Боец
Сообщений: 50
Статус: Offline
|
Уже читал этот урок где-то в интернете.
Бывший администратор Samp-Rp.
|
|
|
|
Nikemmi |
Дата: Пятница, 13.06.2014, 12:08 | Сообщение # 5
|
Хороший))0
Сообщений: 475
Статус: Offline
|
Классный урок. А если .dll переименовать в asi, то инжект не будет требоваться?
Delphi программирование [Delphi]Узнаем координаты перса BunnyHop для Steam/Non steam
|
|
|
|
DexT3R |
Дата: Пятница, 13.06.2014, 12:30 | Сообщение # 6
|
(•̪●)=ε/̵͇̿̿/’̿’̿ ̿ ̿̿ ̿ ̿””
Сообщений: 1978
Статус: Offline
|
Nikemmi, Нет, формат ".asi" - это загрузчик ".dll" файлов.
НИЧЕГО НЕ ПРОДАЮ В ТЕЛЕГРАММЕ И ВК!!
Сообщение отредактировал Kukushka - Пятница, 13.06.2014, 12:30 |
|
|
|
Cheerito |
Дата: Среда, 09.07.2014, 22:17 | Сообщение # 7
|
Любитель
Сообщений: 43
Статус: Offline
|
Для меня это все сложно
|
|
|
|