DLL - Dynamic Link Library иначе динамически подключаемая
библиотека, которая позволяет многократно применять одни и те же функции в
разных программах. На самом деле довольно удобное средство, тем более что
однажды написанная библиотека может использоваться во многих программах. В
сегодняшнем уроке мы научимся работать с dll и конечно же
создавать их!
Ну что ж начнём!
Для начала создадим нашу первую Dynamic Link Library! Отправляемся в
Delphi и сразу же лезем в меню File -> New ->Other.
Перед нами появляется вот такое окошко:
Выбираем в списке Dynamic-Link Library (в версиях младше 2009 Delphi
пункт называется DLL Wizard).
В результате у нас появляется лишь окно с кодом, заметьте никакой формы у нас
здесь нет !
Теперь начинается самое интересное. Напишем наши первые процедуры в библиотеке.
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;
Вот и все ! Второй способ получился довольно громоздкий, но его плюс в
уточнении хранящегося объекта в библиотеке.
Скачать исходник (dll библиотека + 1 способ + 2 способ )
|