Форма входа

Категории раздела

Мои статьи [15]

Поиск

Наш опрос

Оцените мой сайт
Всего ответов: 62

Статистика


Онлайн всего: 1
Гостей: 1
Пользователей: 0




Понедельник, 25.11.2024, 05:00
Приветствую Вас Гость | RSS

Delphiport.ucoz.com

Главная | Регистрация | Вход
Каталог статей


Главная » Статьи » Мои статьи

Динамические подключаемые библиотеки .dll в Delphi
  
   В этой статье мы рассмотрим одну очень интересную и полезную вещицу , а именно применение библиотек динамической компоновки, для создания своих программ. Если развернуто расписывать эту фишку, то в результате получится весьма объемный и сложный для понимания материал, да и к чему это делать если все это давным давно уже сделано профессионалами? Нам для ознакомления достаточно понять, что упомянутые выше библиотеки, представляют собой файлы с расширением .dll, содержащие написанные нами процедуры и функции. Возникает резонный вопрос, - "А для чего все это нужно и какая от этого польза?"). Надеюсь, что разбирая ответ на него, взамен мы получим понимание и умение применять .dll библиотеки в своих программах. 

   Итак, представим себе что мы написали какую нибудь объемную программулину,  с кучей различных процедур, функций, описаний и прочих элементов. Как правило когда появляется необходимость спустя некоторое время (скажем через месяц) внести в программу какие либо изменения, то в во всем написанном вами же коде, сам черт ногу сломит, и это при том, что каждая процедура будет снабжена подробнейшим комментарием). Да и сам размер как исполняемого файла, так и области памяти куда программа будет загружаться помимо прочего, напрямую зависит от объема общего листинга программы. 
   Как же поступить, чтобы оптимизировать создаваемое нами ПО?... 
   - Вот тут нам на помощь и приходят динамические библиотеки .dll .
То-есть что по сути происходит? Мы создаем в каталоге с программой файл, или ряд файлов с расширением .dll, загружаем их всеми нашими процедурами, функциями ну и как правило там же и описываем их. А далее по мере необходимости, мы указываем нашей программе, из какого файла .dll нам нужно вызвать нужную нам процедуру или функцию))). То-есть выделение для этого памяти системой, происходит только в момент вызова))). Ну и когда объемные описания вынесены из общего листинга проекта, в нем гораздо проще разобраться это во первых, и при компиляции получается более компактный файл это - во вторых))). В третьих если в последствии нужно сделать апдейт, то гораздо удобнее заменить дэлэлку в каталоге с программкой, чем заменять программу целиком). 
   Рассмотреть как все это происходит, я предлагаю на сквозном примере, сложения двух чисел, где собственно процедура самого сложения будет находиться в файле .dll.
   
   Итак приступим:

1) Запускаем Delphi и создаем новый проект;

2) Размещаем на форме 3 компонента Edit2 компонента Label, 1 компонент Button, и настраиваем примерно как у меня, затем компилируем и сохраняем;

3) Далее заходим в пункт меню File -> New -> Other -> Dynamic-linc Library, жмем Ок и сохраняем все в папке с нашим проектом, только изменяем имя сохраняемого на Project2.

4) В открывшемся листинге, текст между разделами library Project2 и uses, можно удалить, после значения {$R *.res}, создаем нашу функцию сложения и описываем ее:

Function summ(a,b:Integer):Integer; StdCall; {Называем ее именем summ, тип переменных Integer, выходной параметр тоже Integer, 
StdCall - говорит о стандартном способе вызова, то-есть о совместимости с Windows API, если его не указать то сторонние  разработчики ПО будут испытывать сложности с подключением к нашей библиотеке, если мы не планируем, чтобы кроме нас библиотеку кто то использовал еще, то можно его и
не указывать, но я все же укажу};

begin

result:=a+b; //Ну а тут пишем, что наша функция должна выполнять;

end;

5) После того как мы описали нашу функцию, под оператором end; пишем: 

exports summ; {Здесь ключевое слово expotrs, позволяет экспортировать нашу функцию summ, чтобы ее можно было использовать извне, то-есть из любых программ};

   По скольку код нашей "дэлэлки" не велик, ниже приведу скринчик ее содержимого):



6) Компилируем нашу библиотеку, соглашаемся с сообщением, что компилируем ее без параметров, закрываем наш Project2 и открываем Project1.dproj, а на вопрос о сохранении изменений в Project2.dproj, жмем Ok
     Да! Еще маленький нюанс,... заходим в папку с нашим проектом, у меня это: 
C:\Users\Alexander\Documents\RAD Studio\Projects\.dll в Delphi\Win32\Debug\Win32\Debug 
и копируем от туда скомпилированную библиотеку - Project2.dll  в общую папку с проектом, у меня это: 
C:\Users\Alexander\Documents\RAD Studio\Projects\.dll в Delphi  ...чтобы наша головная программа смогла ее найти).

7) Далее прописываем в наш открывшийся проект созданную нами функцию, для этого после значения {$R *.res} раздела implementation , пишем: 

Function summ(a,b:Integer):Integer; StdCall; External 'Project2.dll'; {Здесь External 'Project2.dll' говорит о том, что описание функции мы берем извне, то-есть из созданного нами .dll файла};

8) Создаем обработчик событий OnClick на нашей кнопке, где прописываем буквально следующее:

var

c:Integer; //Здесь с - промежуточная переменная, куда будет помещаться результат работы нашей функции;

begin

c:=(Summ(StrToInt(Edit1.Text),StrToInt(Edit2.Text))); {Тут, мы в качестве первого параметра функции указываем содержимое Edit1, а второго - 
Edit2, и помещаем результат в переменную с }

Edit3.Text:=IntToStr(c); //Выводим результат в  Edit3;

end;

   Ну вот собственно и все. Запускаем проект, вводим значения в первые два эдита, жмем - "Посчитать" и если вы все выполняли внимательно, то в Edit3, отобразится сумма введенных нами чисел))).

   Разумеется полный функционал динамических библиотек, не исчерпывается настоящей статьей, ведь в .dll можно также загонять ресурсы, мелодии и прочее, но начало мы все же положили, об остальном вы можете узнать самостоятельно. Благо источников знаний по этой тематике "дофига и трошки", ну или я если найдет озарение, чиркану очередную статейку, - посмотрим... не обещаю в общем)...



Категория: Мои статьи | Добавил: Sashok (19.10.2013)
Просмотров: 4742 | Комментарии: 4 | Рейтинг: 5.0/1
Всего комментариев: 0
Имя *:
Email *:
Код *:

Copyright MyCorp © 2024