Delphi - Работа с DLL библиотеками
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 способ )
P.S. Хотите вперед всех остальных посетителей сайта получать свежие Видео уроки, Аудио подкасты, статьи по Delphi.
Участвовать в конкурсах и постепенно вливаться в нашу команду ?!
Тогда прямо сейчас подписывайтесь на бесплатную мультимедийную рассылку сайта delphiexpert.ru
Нас уже больше чем 3500 человек ! Подписаться
Похожие материалы
- Delphi & Bass. Эффект затухания звука
- Delphi исходники - поиск кратчайшего пути в лабиринте
- Исходник игры Солитер
- Delphi уроки - Drag&Drop, перетаскивание строк в компоненте DBGrid
- Delphi урок - Невидимая форма с видимыми компонентами
Последние из рубрики
- Видео урок - Delphi простейшая работа с PDF документацией (часть 2)
- Delphi & Bass. Эффект затухания звука
- Delphi изменяем миниатюру программы в Windows 7