Как создать свой dll файл


Но ведь они не растут на деревьях, их делают точно такие же люди, причём делаются они совершенно простыми и доступными средствами — абсолютно любой может сделать собственную подключаемую библиотеку. И в этой статье я попробую доходчиво описать, как это сделать. Итак, что же есть dll? Это, по сути, исполняемый файл, который не имеет точки входа — его нельзя запустить как обычную программу, зато можно подключать к. Для обычных программ, написанных на С например, присоединять библиотеки вместо вшивания их функций прямо в исполняемый файл или вообще вшивания их исходного кода прямо в программу — это вопрос выбора, поскольку между dll и exe разницы ни в производительности, ни в возможностях, не. Но в случае с Game Maker, который очень ограничен в способностях, отъедает довольно много оперативной памяти и к тому же не слишком быстро выполняет скрипты, разница становится очень существенна если не колоссальна. Если ничего такого особенного игре не требуется, то без dll вполне можно обойтись. А если игра выполняет большое количество вычислений, или требуется хранить очень много данных в оперативной памяти, или же вообще использовать такие вещи, как многопроцессорность, OpenGL, продвинутые звуковые эффекты, и так далее — dll становятся незаменимыми. Зачем же писать свою собственную динамическую библиотеку? Ответ очень прост: увеличить производительность вычислений, расширить возможности Game Maker, или и то и другое. Но написание dll — процесс не слишком простой, прямолинейный и очевидный: в зависимости от выбранного языка программирования, особенностей реализации компилятора и еще тысячи мелочей, решить казалось бы тривиальные задачи может быть весьма непросто. А еще — изобретать велосипеды это весело и познавательно, но попусту расходует время и силы. Итак, вы собрались писать свою dll. Самый первый вопрос — на каком языке программирования? Если вы уже знаете GML, то особых трудностей с изучением языков, с помощью которых делаются dll, у вас не возникнет. Очень многие современные языки поддерживают сборку dll, и человеку, не знакомому ни с одним из них, сделать выбор будет тяжело. Типичный выбор — C++ или Pascal. Однако у обоих есть свои недостатки, порой очень серьёзные, но на фоне остальных языков программирования эти два выгодно отличаются целым рядом параметров. Однако я советую использовать С читается: «Си». Тот, который не стал якорем, ушедшим на дно. Если вы слышали много хороших отзывов о C++ — С имеет в себе абсолютное большинство из. Но при этом он гораздо проще и надёжней, и его легче изучать, а работать с ним гораздо приятней. В операционной системе Linux думать бы не пришлось — стандартный компилятор GCC поставляется вместе с ОС, а инструментом разработки отлично бы выступила связка Bash и Vim. А вот в Windows вам всё это добро придётся скачивать, причём те же самые программы не будут доступны, и нужно будет искать альтернативы. Статью я буду писать ориентируясь на. PS: от себя рекомендую шрифт Terminus для работы в среде разработки. Выбор шрифта это дело каждого, но для такого рода занятий лучший выбор — моноширинный шрифт. Азы программирования на Если вы уже умеете программировать на С, то переходите к следующему параграфу. Самый простой способ — просто писать их все в одном файле. Конечно, файл может стать очень громоздким, но ничего страшного в этом нет — компилятору всё равно. Другой способ — распределить функции по файлам, создать заголовочные файлы, подключить в главный файл все заголовочные. Итак, допустим, вы более или менее знаете GML. Первое отличие, стоящее упоминания — способ определения функции. В Game Maker достаточно было просто создать функцию и назвать её как нибудь, а внутри писать что угодно, после чего из любого места функция вызывается элементарным образом. Поскольку С — компилируемый язык, ему надо знать заранее, какого типа будут переменные, из одной и той же функции просто так возвращать строки, числа, таблицы и массивы когда и как вздумается — не получится. Вместо этого нужно заранее чётко определиться, что это. Во второй строчке — начинается блок кода, привычная вещь. Блок кода, идущий сразу после объявления функции, является телом функции — эквивалент содержимого в файле скрипта в GML. В объявлении функции — первой строчке — слева направо идут: тип возвращаемой переменной, имя функции, и в скобках — список типов и названий принимаемых аргументов, через запятую. То есть если вы объявили, что функция возвращает число, то нельзя вернуть строку — компилятор попросту откажется компилировать такой файл. Благо, что сообщения об ошибках, как правило, очень доходчивые, и обычно сразу можно установить, что же пошло не. В числовом типе можно хранить дробные числа, в очень широких пределах, поскольку это число с плавающей запятой. Не вдаваясь в детали, это значит, что число может хранить определённое количество цифр, а запятая между ними может съезжать влево получаются маленькие, но точные числа, например 12. Однако, это не значит, что нельзя записать очень большое или очень маленькое число — запятая может ездить в очень широких пределах — сотни знаков — просто цифры, которым не хватило места, будут обозначены нулями. Число в формате double может хранить 15 цифр, а максимальное число «нулей» составляет чуть более 300. Одна переменная типа double потребляет 8 байт памяти. В строковом типе можно хранить внезапно ссылки на строки. Ограничений на эти переменные почти нет — на сколько памяти компьютера хватит, такой и максимальный размер. Ссылка на строку занимает 4 байт, а каждая буква строки занимает ровно 1 байт. Значит в гигабайт памяти влезает более миллиарда букв. Для сравнения — вся «Война и мир» целиком составляет всего около 2. Вместо этого нужно использовать специальные функции, но об этом далее. Язык С позволяет писать очень вольно, и в то же время весьма привередлив. Но на данном этапе, этого вполне достаточно. Создание проекта DLL в CodeBlocks. К этому моменту у вас уже должен быть рабочий компилятор и настроенная среда разработки. Итак, создайте в CodeBlocks новый проект. В качестве шаблона выберите «empty project». Перед вами окажется пустой проект со стандартными настройками, не имеющий ни единого файла. Кликните правой кнопкой мыши по значку проекта, и выберите пункт «properties». Во второй вкладке, в качестве типа готового файла «Selected build target options — Type»выберите «Dynamic library» для обоих версий построения Debug и Release. В этом окне вам больше ничего не понадобится. Кликните по значку проекта опять, теперь выберите «Build options». Там уже версии построения не в виде списка, а в виде дерева — вверху Общие, а дальше отдельно для Debug и Release. Во всех этих категориях снимите все флажки, они нам не понадобятся. Это флаг, который даёт подсказку, что мы будем компилировать dll а не обычный исполняемый файл. Это не влияет на функционал готового файла, но компилятор может сделать дополнительные оптимизации, имея эти данные. Теперь откройте вторую вкладку. Туда вставьте «-Wall -pedantic» без кавычек, с дефисами. Это включает вывод всех возникших ошибок на экран, а также включает отображение дополнительных, несерьёзных ошибок — педантичный режим. Его можно и не включать, но будучи включённым, он будет постоянно донимать вас сообщениями и претензиями к качеству, если ваш код становится похож на разварившиеся макароны — это развивает практику написания хорошо структурированного кода, вместо задрачивания способности написания абсолютно нечитаемых однострочников на три страницы в ширину. Говоря о ширине — придерживайтесь ширины в 80 символов. Всё равно читать длиннючие строки текста — ни разу не удобно. Обратно к проекту: выберите вторую основную вкладку в Общей конфигурации. В поле «Link libraries» добавьте «user32» без кавычек, а в поле «Other linker options» — «-static-libgcc» без кавычек с дефисами. Библиотека user32 является обязательным компонентом создания dll, но для обычных исполняемых файлов она обычно не нужна. А опция -static-libgcc статически прикрепит код стандартной библиотеки GCC в готовый dll. При использовании MinGW этот флаг является почти обязательным для любой программы, поскольку без него, готовый файл будет требовать ряд очень специфичных сторонних dll для функционирования, а с этой опцией они все сразу включены внутрь него, и проблем не возникнет ни на одном компьютере. Теперь в конфигурации Debug выберите вторую подвкладку первой основной вкладки, в текстовое поле вставьте «-g -O0» без кавычек с дефисами. Эти флаги включают дополнение готового файла спецсимволами для отладки, и явно полностью отключают оптимизацию готового файла -O0 — почти обязательный ключ для отладки; можно не указывать — включено по умолчаниючто логично, ведь это отладочная конфигурация. Выберите конфигурацию Release, в то же поле вставьте «-s -Ofast». Это извлечёт из готового файла все ненужные спецсимволы, и сделает оптимизацию для предельно высокой производительности. Если программа не полагается на идеальное следование этим стандартам — его можно включать, что как раз наш случай. Теперь добавляем новый пустой файл к проекту, сохраняем его как «main. Вот и всё, проект настроен создать динамическую библиотеку! Итак, всё готово к непосредственно созданию динамической библиотеки. Для начала создадим нечто рабочее. Примера ради, пусть это будет функция, возводящая число в квадрат. Для этого напишем в файл main. Для этого нажмите Ctrl+F9. После этого вы либо увидите, что построение закончено успешно за N секунд, либо увидите список ошибок, которые не дают файлу скомпилироваться. Если вы всё делали по инструкции, то никаких ошибок возникнуть не. Скопируйте её в папку к вашей игре на Game Maker. Теперь библиотеку нужно подключить. Четвёртый аргумент — возвращаемое значение. В самом С функция может ничего не возвращать, для этого ей достаточно указать «void» в качестве типа возвращаемой переменной и не использовать ключевое слово «return». Если функция не должна ничего возвращать, то просто верните строковый нуль return NULLничего страшного от этого не случится. Следующий аргумент — количество аргументов, которые принимает функция в dll, в нашем случае — 1. А дальше — через запятую в правильном!!! Один момент следует упомянуть: нельзя выбрать тип аргументов, если их больше 4 — в этом случае они все считаются числовым типом. Если вы не присоединили к проекту ни один стандартный файл компилятора, то NULL может быть не объявлен, что вызовет ошибку. Тогда используйте «0» вместо «NULL», как правило это равнозначно. Это сразу говорит о том, что dll работает корректно. Это следует делать перед завершением работы основного приложения. Хорошим тоном считается вносить комментарии по поводу того, что эти функции делают, в заголовок этой функции. Также, если вы собираетесь распространять свою библиотеку, вы должны создать пример-пустышку, в котором собраны все эти функции, на абсолютно все виды работ с вашей DLL. Подключение к игре альтернативным способом. Существует другой способ подключить dll к игре — включение DLL в HEX-расширение. В случае же с расширением, потребуется приложить не только сам файл расширения и напоминание о том, что его необходимо установить перед работой, но еще и страничку документации с записанным туда списком всех фукнций и помощью по их использованию. Для этого, вам потребуется Extension Maker. Первый предназначен для добавления новых кнопок в меню действий объекта. А вот с помощью второго можно не только добавлять новые кнопки, функции и произвольные файлы вообще, но и встраивать DLL, причём делается это очень легко. Вы сразу увидите зеленую кнопку «Add DLL». После её нажатия, открывается окно выбора библиотеки. После выбора, появится три вкладки для добавления данных из библиотеки. Первая — для добавления функций, вторая — констант, третья — окно прочих опций библиотеки, где можно назначить функцию старта и выключения DLL. Вторая вкладка делает то же самое, что окно выбора констант в самом Game Maker, её можно не трогать, третья так и вовсе не представляет ценности, кроме совсем особых случаев, поэтому нас интересует только первая. В ней есть поле с функциями со вполне очевидным интерфейсом, из предыдущего параграфа должно быть абсолютно ясно, как с ним управляться, потому что делает он всё то же самое, и расписывать все эти вещи я не. Вы научились создавать рабочие динамические библиотеки и подключать их к вашей игре! Теперь, расширьте ваши навыки по программированию в С, чтобы создавать более продвинутые динамические библиотеки. В приложенном файле готовый проект, в котором также использовано разбиение на несколько файлов, и простенькая операция над строками, а также файл Game Maker 8, где в коде создании комнаты прописаны все нужные действия по работе с библиотекой. НЛО прилетело исправило ссылки, а заодно и набрало правильную пунктуацию. Linxus: Статья отличная, но агитировать за С не обязательно. Илья: Цитировать агитировать за С не обязательно Поправил. А если серьезно, то что, на делфи писать дллки? И на том, и на другом пробовал, не. Oleg Zap: Дельфи сложный, как судоку с дробями, а бейсик старый как интернет.

Смотри также