Что такое DLL? DLL - Dynamic Link Library, динамическая библиотека, в которую записываются различные функции и процедуры, которые программа, в последующем, может из библиотеки экспортировать и использовать. Вся прелесть данных библиотек в том, что весь основной код, все модули и функции программы можно записать в .DLL формат, после чего распаковать его куда-либо в систему пользователя и обращаться к нему при надобности вызова этих процедур, в то время, как ваша программа при обычной работе будет использовать минимальное количество ресурсов.
Теперь давайте разберёмся, как создавать данные библиотеки. В Delphi это делается крайне просто:
Выбираем Menu - File - New - Other:
После чего выбираем Dynamic Link Library:
И нажимаем Ok.
Delphi сгенирирует пустой шаблон DLL - библиотеки. Теперь научимся его правильно заполнять и рассмотрим все нюансы.
Давайте пропишем в код первую процедуру, в которой будет лишь функция ShowMessage (функция диалога). Для этого в секцию Uses нужно добавить модуль Dialogs и сразу после {$R *.res} прописать:
Procedure One; stdcall; export;
Begin
ShowMessage('1');
End;
Теперь подробнее об операторах StdCall и Export.
StdCall - это оператор, который реализует соглашение о передаче параметров данной процедуры и возможности вызова самой процедуры. Он отправляет данные в стек (часть памяти), укладывая их справа налево, после чего программа, которая использует данную библиотеку, считывает эти данные из стека и очищает его.
Export уточняет, что процедура или функция будет затем перемещена в секцию Exports. Что за секция? Так мы плавно переходим к последней части структуры нашей DLL - библиотеки - секции Exports, которая объявляется перед основной связкой begin..end, после объявления всех процедур и функций. Объявляется она ключевым словом Export, после чего ставится пробел и прописываются все те процедуры, которые могут быть вызваны затем программой. В нашем случае:
Exports One;
Теперь сохраняем проект и нажимаем комбинацию Ctrl+F9, тем самым компилируем библиотеку. Проверяем папку, куда сохранили проект и видим:
Всё прошло успешно.
Теперь научимся экспортировать данные из библиотеки. Для этого создадим новый проект, сохраним его и в папку, куда сохранили, закинем ту самую DLL - библиотеку (project1), которую создали выше.
И рассмотрим способы вызова нашей процедуры.
Первый:
implementation
procedure One; stdcall; external 'Project1.dll';
{$R *.dfm}
После ключевого слова implementation прописывается название процедуры, которая будет вызвана, затем оператор stdcall, с которым мы познакомились выше, а затем дирректива external, которая указывает, из какой библиотеки производится вызов.
Теперь добавим компонент Button на форму и на обработчике события onclick пропишем импортированную процедуру:
procedure TForm1.btn1Click(Sender: TObject);
begin
One;
end;
Запуск, проверка:
Если использовать библиотеки данным образом, то при старте программы в память одновременно будут выгружаться все процедуры и функции, которые мы, в идеале, хотели выгружать и использовать только тогда, когда нам это нужно. В следующем уроке рассмотрим второй способ, который выгружает в память нужную процедуру или функцию тогда, когда нам это нужно.
Спасибо за внимание!