DLL - Dynamic Link Library иначе динамически подключаемая библиотека, которая позволяет многократно применять одни и те же функции в разных программах. На самом деле довольно удобное средство, тем более что однажды написанная библиотека может использоваться во многих программах. В сегодняшнем уроке мы научимся работать с dll и конечно же создавать их! Ну что ж начнём!
Для начала создадим нашу первую Dynamic Link Library! Отправляемся в Delphi и сразу же лезем в меню File -> New ->Other.
В результате у нас появляется лишь окно с кодом, заметьте никакой формы у нас здесь нет ! Теперь начинается самое интересное. Напишем наши первые процедуры в библиотеке.
library Project2; //Вы, наверное уже заметили, что вместо program //при создании dll используется слово library. //Означающее библиотека. uses SysUtils, dialogs, Classes; // Внимание ! Не забудьте указать эти модули, // иначе код работать не будет {$R *.res} {В ЭТУ ЧАСТЬ ПОМЕЩАЕТСЯ КОД DLL}
Procedure FirstCall; stdcall; export; //Stdcall – При этом операторе параметры помещаются в стек //справа налево, и выравниваются на стандартное значение //Экспорт в принципе можно опустить, используется для уточнения //экспорта процедуры или функции. Begin ShowMessage('Моя первая процедура в dll'); //Вызываем сообщение на экран End;
Procedure DoubleCall; stdcall; export; Begin ShowMessage('Моя вторая процедура'); //Вызываем сообщение на экран End;
Exports FirstCall, DoubleCall; //В Exports содержится список экспортируемых элементов. //Которые в дальнейшем будут импортироваться какой-нибудь программой. begin End.
На этом мы пока остановимся т.к. для простого примера этого будет вполне достаточно. Сейчас сохраняем наш проект, лично я сохранил его под именем Project2.dll и нажимаем комбинацию клавиш CTRL+F9 для компиляции библиотеки. В папке, куда вы сохранили dpr файл обязан появится файл с расширением dll, эта и есть наша только что созданная библиотека. У меня она называется Project2.dll
Займёмся теперь вызовом процедур из данной библиотеки. Создаём по стандартной схеме новое приложение. Перед нами ничего необычного просто форма. Сохраняем новое приложение в какую-нибудь папку. И в эту же папку копируем только что созданную dll библиотеку. Т.е. в данном примере Project2.dll
Теперь вам предстоит выбирать, каким способом вызывать функции из библиотеки. Всего существует два метода вызова.
Способ № 1 Пожалуй, это самый простой метод вызова процедур находящихся в библиотеке. Идеально подходит для работы только с одной библиотекой.
Ну что поехали... После ключевого слова implementation прописываем следующий код:
Procedure FirstCall; stdcall; external 'Project2.dll'; // Вместо Project2.dll может быть любое имя библиотеки Procedure DoubleCall; stdcall; external 'Project2.dll';
Здесь, как вы уже наверное догадались, мы сообщаем программе названия наших процедур и говорим, что они находятся в dll библиотеке, в моем случае с именем Project2.dll
Теперь для того, что бы вызвать данные процедуры нам необходимо лишь вставить их названия в любое место кода, что мы сейчас и сделаем. Кидаем на форму 2 компонента Button с закладки Standart и создаем на каждой обработчик событий OnClick
OnClick первой кнопки:
Procedure TForm1.Button1Click(Sender: TObject); Begin FirstCall; // Имя процедуры, которая находится в dll End;
OnClick второй кнопки:
Procedure TForm1.Button2Click(Sender: TObject); Begin DoubleCall; // Имя процедуры, которая находится в dll End;
Вот и все !
Способ № 2: Сложнее чем первый, но у него есть свои плюсы, а самое главное, что он идеально подходит для плагинов. Для применения данного метода, первым делом объявляем несколько глобальных переменных:
Var LibHandle: HModule; //Ссылка на модуль библиотеки FirstCall: procedure; stdcall; //Имена наших процедур лежащих в библиотеке. DoubleCall: procedure; stdcall;
Затем после ключевого слова implementation напишем процедуру которая будет загружать нашу библиотеку:
Procedure LoadMyLibrary(FileName: String); Begin LibHandle:= LoadLibrary(PWideChar(FileName)); //Загружаем библиотеку! // Внимание ! PChar для версий ниже 2009 Delphi If LibHandle = 0 then begin MessageBox(0,'Невозможно загрузить библиотеку',0,0); Exit; End; FirstCall:= GetProcAddress(LibHandle,'FirstCall'); //Получаем указатель на объект //1-ий параметр ссылка на модуль библиотеки //2-ой параметр имя объекта в dll DoubleCall:= GetProcAddress(LibHandle,'DoubleCall'); If @FirstCall = nil then begin //Проверяем на наличие этой функции в библиотеке. MessageBox(0,'Невозможно загрузить библиотеку',0,0); Exit; End; If @DoubleCall = nil then begin //Проверяем на наличие этой функции в библиотеке. MessageBox(0,'Невозможно загрузить библиотеку',0,0); Exit; End; End;
После чего на форме создаем, обработчик событий OnCreate, в котором с помощью только что созданной процедуры мы загрузим нашу библиотеку
Procedure TForm1.FormCreate(Sender: TObject); Begin LoadMyLibrary('Project2.dll'); End;
Теперь опять же, для того, что бы вызвать необходимые процедуры из нашей библиотеки нам необходимо лишь вставить их названия в любое место кода. Для этого кидаем на форму 2 компонента Button с закладки Standart и создаем на каждой обработчик событий OnClick
OnClick первой кнопки:
Procedure TForm1.Button1Click(Sender: TObject); Begin FirstCall; // Имя процедуры, которая находится в dll End;
OnClick второй кнопки:
Procedure TForm1.Button2Click(Sender: TObject); Begin DoubleCall; // Имя процедуры, которая находится в dll End;
Ну и напоследок создаем обработчик событий OnDestroy на форме, в котором выгружаем dll библиотеку из памяти
Procedure TForm1.FormDestroy(Sender: TObject); Begin FreeLibrary(LibHandle); //Выгружаем библиотеку из памяти. End;
Вот и все ! Второй способ получился довольно громоздкий, но его плюс в уточнении хранящегося объекта в библиотеке.
|