В этой статье мы рассмотрим одну очень интересную и полезную вещицу , а именно применение библиотек динамической компоновки, для создания своих программ. Если развернуто расписывать эту фишку, то в результате получится весьма объемный и сложный для понимания материал, да и к чему это делать если все это давным давно уже сделано профессионалами? Нам для ознакомления достаточно понять, что упомянутые выше библиотеки, представляют собой файлы с расширением .dll, содержащие написанные нами процедуры и функции. Возникает резонный вопрос, - "А для чего все это нужно и какая от этого польза?"). Надеюсь, что разбирая ответ на него, взамен мы получим понимание и умение применять .dll библиотеки в своих программах.
Итак, представим себе что мы написали какую нибудь объемную программулину, с кучей различных процедур, функций, описаний и прочих элементов. Как правило когда появляется необходимость спустя некоторое время (скажем через месяц) внести в программу какие либо изменения, то в во всем написанном вами же коде, сам черт ногу сломит, и это при том, что каждая процедура будет снабжена подробнейшим комментарием). Да и сам размер как исполняемого файла, так и области памяти куда программа будет загружаться помимо прочего, напрямую зависит от объема общего листинга программы. Как же поступить, чтобы оптимизировать создаваемое нами ПО?... - Вот тут нам на помощь и приходят динамические библиотеки .dll . То-есть что по сути происходит? Мы создаем в каталоге с программой файл, или ряд файлов с расширением .dll, загружаем их всеми нашими процедурами, функциями ну и как правило там же и описываем их. А далее по мере необходимости, мы указываем нашей программе, из какого файла .dll нам нужно вызвать нужную нам процедуру или функцию))). То-есть выделение для этого памяти системой, происходит только в момент вызова))). Ну и когда объемные описания вынесены из общего листинга проекта, в нем гораздо проще разобраться это во первых, и при компиляции получается более компактный файл это - во вторых))). В третьих если в последствии нужно сделать апдейт, то гораздо удобнее заменить дэлэлку в каталоге с программкой, чем заменять программу целиком). Рассмотреть как все это происходит, я предлагаю на сквозном примере, сложения двух чисел, где собственно процедура самого сложения будет находиться в файле .dll. Итак приступим:
1) Запускаем Delphi и создаем новый проект;
2) Размещаем на форме 3 компонента Edit, 2 компонента 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 можно также загонять ресурсы, мелодии и прочее, но начало мы все же положили, об остальном вы можете узнать самостоятельно. Благо источников знаний по этой тематике "дофига и трошки", ну или я если найдет озарение, чиркану очередную статейку, - посмотрим... не обещаю в общем)...
|