Создание и использование DLL |
![]() |
![]() |
Статьи |
DLL (динамические библиотеки) содержат дополнительные функции или сложные библиотеки для преобразования изображений. Также в DLL можно хранить не только функции и процедуры, но также и ресурсы (всевозможные изображения, иконки, строки и т.д.). А также формы, плагины. Краткое описание функций и приёмов работы с DllРазберём два способа работы с Dll: 1 способПривязка Dll к программеЭто наиболее простой метод работы с Dll, но он имеет один существенный недостаток.
Если библиотека не будет найдена, то программа не запустится, просто выдавая ошибку о том, что не может найти Dll. Поиск ведётся, в корневом каталоге, в текущем, в папке Общая форма приёма:
А если это не функция, а процедура?
FunctionName(ProcedureName) - имя функции или процедуры, которая будет использоваться в программе. 2 способДинамическая загрузка DllНесмотря на то, что этот метод более сложный, он является, наиболее элегантным. Хорошо то, что он лишён недостатка первого способа, но объём кода необходимый для этого варианта поражает размерами, , причем сложность в том, что функция, импортируемая из DLL достуна лишь тогда, когда эта DLL загружена и находится в памяти. Далее следует, краткое описание функций API используемых этим методом. LoadLibrary(LibFileName: PChar) - Загрузка указанной Dll в память. При успешном завершении операции, возвращается дескриптор THandle этой библиотеки. GetProcAddress(Module: THandle; ProcName: PChar) - считывает адpес экспоpтиpованной библиотечной функции. При успешном завершении функция возвращает дескриптор TFarProc функции в загруженной DLL. FreeLibrary(LibModule: THandle) - делает недействительным этот модуль и освобождает связанную с ним память. После вызова этой функции, функции библиотеки недоступны. А теперь самое главное, ПРИМЕРЫ... Пример 1Привязка Dll к программе
Теперь то-же самое, но только вторым способом(Помните я вам говорил про массивность кода?)... Пример 2Динамическая загрузка Dll
Отличия первого метода от второго видны я думаю сразу... Ну да ладно, посмотрим теперь на саму библиотеку. Пример 3Исходник проекта
Как уже писалось выше, в Dll можно размещать не только функции, но и иконки, курсоры, рисунки, меню и т.д. Приведённое ниже описание покажет вам, как это сделать. Для начала опишу всё поподробнее. Для помещения ресурсов в Dll нужно:
Теперь, тоже, но поподробнее:
а) Запускаем б) Компилируем *.res файл при помощи
Здесь первое поле - название ресурса в *.res файле(и в Dll соответственно), второе - его тип (ICON>, BITMAP и т.д.). Третье - местонахождение файла, содержащего данный ресурс. Перемещаем полученный *.res в каталог Исходник Dll, куда добавляем В каталоге
Компилируем Dll, включая *.res. Находясь в каталоге
Открыть Dll из Delphi и нажать build. Размещение в DLL ресурсов и форм. В DLL можно размещать не только функции, но и курсоры, рисунки, иконки, меню, текстовые строки. На этом мы останавливаться не будем. Замечу лишь, что для загрузки ресурса нужно загрузить DLL, а затем, получив ее дескриптор, - загружать сам ресурс соотвествующей функцией (LoadIcon, LoadCursor, и т.д.). В этом разделе мы лишь немного затронем размещение в библиотеках DLL окон приложения (т.е. форм в Дельфи). Для этого нужно создать новую DLL и добавить в нее новую форму ( Далее, если форма представляет собой диалоговое окно (модальную форму (bsDialog)), то добавляем в DLL следующую функцию (допустим, форма называется Form1, а ее класс - TForm1): Пример 3Размещение формы в Dll
Если же нужно разместить в DLL немодальную форму, то необходимо сделать две функции - открытия и закрытия формы. При этом нужно заставить DLL запомнить дескриптор этой формы. Создание плагинов Здесь мы не будем подробно рассматривать плагины, т.к. уже приведенные выше примеры помогут Вам легко разобраться в львиной части программирования DLL. Напомню лишь, что плагин - дополнение к программе, расширяющее ее возможности. При этом сама программа обязательно должна предусматривать наличие таких дополнений и позволять им выполнять свое предназначение. То есть, например, чтобы создать плагин к графическому редактору, который бы выполнял преобразование изображений, Вам нужно предусмотреть как минимум две функции в плагине (и, соответственно, вызвать эти функции в программе) - функция, которая бы возвращала имя плагина (и/или его тип), чтобы добавить этот плагин в меню (или в тулбар), плюс главная функция - передачи и приема изображения. То есть сначала программа ищет плагины, потом для каждого найденного вызывает его опозновательную функцию со строго определенным именем (например, GetPluginName) и добавляет нужный пункт в меню, затем, если пользователь выбрал этот пункт - вызывает вторую функцию, которой передает входное изображение (либо имя файла, содержащего это изображение), а эта функция, в свою очередь, обрабатывает изображение и возвращает его в новом виде (или имя файла с новым изображением). Вот и вся сущность плагина. code |