Создание динамической библиотеки подпрограмм и работа с ней


       
Я сейчас не буду объяснять что такое динамическая библиотека подпрограмм и для чего они нужна, так как это выходит за рамки данной статьи.
Перейду сразу к делу (практике).
В PureBasic исходник динамической библиотеки подпрограмм представляет из себя обычные процедуры, но в место оператора Procedure используется оператор ProcedureDLL или оператор ProcedureCDLL если динамическая библиотека подпрограмм должна быть типа cdecl.
Вконце этого оператора может следовать суффикс, обозначающий тип переменной, которую вернет процедура с помощью оператора ProcedureReturn. Например, если нужно чобы процедура возвращала строку текста, т. е. строковую переменную или константу, то следует указать суффикс .s, т. е. ProcedureDLL.s
А если требуется вернуть из процедуры дробное число, занимаемое 4 байта в памяти компьютера, то следует использовать суффикс .f являющийся сокращением от слова Float.
Более подробно о типах переменных.
Если не указан суффикс (как в примерах ниже), то будет использован тип переменной заданный по умолчанию. В PureBasic до версии 4.30 это был тип Long, а в последующих версиях, тип Integer.

Итак, запускаем среду PureBasic (это обязательно должна быть полная версия, а не демо-версия).
Перед нами будет пустой проект - страница в редакторе кода.
В первую очередь нужно сохранить эту страницу в виде файла. Имя файла и его расположение на диске может быть любым.
Далее открываем свойства проекта выбрав в меню Компилятор пункт Настройки компилятора и на закладке Параметры в выпадающем списке Формат исполняемого файла выбираем пункт Shared Dll

Свойства компилятора

Если захотите, можете ещё указать дополнительные данные о файле, такие как его версия, данные об авторе и т. д. Но это не обязательно

Свойства компилятора

Теперь всё готово для ввода кода динамической библиотеки подпрограмм.
Для примера используем простейший код.
Код:
ProcedureDLL Plus(a, b)
ProcedureReturn a+b
EndProcedure


ProcedureDLL Message(Title.s, Message.s)
MessageRequester(Title, Message)
EndProcedure
В этом примере две процедуры. Первая просто складывает числа из переменных a и b и возвращает результат сложения.
Вторая процедура отображает окно с сообщением.

Для создания из этого кода динамической библиотеки подпрограмм, нужно в меню Компилятор выбрать пункт Создать приложение
При этом будет создано несколько файлов, но нас сейчас интересует файл с расширением DLL, это и есть динамическая библиотека подпрограмм.
Теперь задействуем её в нашей программе.

Код:
If OpenLibrary(1, "MyDLL.dll")=0 ; Открываем динамическую библиотеку подпрограмм 
MessageRequester("", "Отсутствует файл MyDLL.dll")
End ; Завершение работы программы
EndIf

a=10 ; Запись данных в переменные
b=20
Result=CallCFunction(1, "Plus", a, b) ; Вызов функции Plus
String.s="a+b="+Str(Result)
CallCFunction(1, "Message", @"Сообщение", @String) ; Вызов функции Message

CloseLibrary(1) ; Закрытие динамической библиотеки подпрограмм
Функция OpenLibrary открывает (загружает в память, если это первый вызов) библиотеку MyDLL.dll, которая должна быть в одной папке этой программой.
Если не получилось открыть, то появится сообщение об этом и работа программы завершится.
В случае успешного открытия, в переменные с именами a и b будут записаны числа (их значения могут быль любыми ).
Далее при помощи функции CallCFunction вызывается функция с именем Plus из динамической библиотеки подпрограмм. Ей передаются данные из переменных a и b, а возвращаемый результат помещается в переменную Result
В следующей строке в строковую переменную String будет записан текст "a+b=" и текущее значение переменной Result, преобразованное в строковой вид функцией Str
После этого вызывается функция Message из динамической библиотеки подпрограмм, которой передаётся текущее содержимое строковой переменной String. Эта функция отобразит окно с текстом из переменной String.
Когда же это окно будет закрыто, функция CloseLibrary закроет динамическую библиотеку подпрограмм.
Так как дальше кода нет, работа программы завершится.


Скачать архив со всеми файлами можно здесь.


PS.
Здесь был приведён пример создания и работы с динамической библиотекой подпрограмм в операционной системе семейства Windows, но все выше написанное можно отнести и к созданию динамической библиотекой подпрограмм для операционной системы Linux, но нужно использовать компилятор для этой платформы и учесть, что у динамической библиотеки подпрограмм будет расширение SO
Эти же примеры будут работать в MacOS X и AmigaOS.



Учебник                Главная

Сайт создан в системе uCoz