Работа с DLL библиотеками

Опубиковано: 04.11.2009 г., автор: , просмотров: 85786

Delphi - Работа с DLL библиотеками

DLL  - Dynamic Link Library иначе динамически подключаемая библиотека, которая позволяет многократно применять одни и те же функции в разных программах. На самом деле довольно удобное средство, тем более что однажды написанная библиотека может использоваться во многих программах. В сегодняшнем уроке мы научимся работать с dll и конечно же создавать их!
Ну что ж начнём!

Для начала создадим нашу первую Dynamic Link Library! Отправляемся в Delphi и сразу же лезем в меню File -> New ->Other.
Перед нами появляется вот такое окошко:

Delphi dll библиотека

Выбираем в списке Dynamic-Link Library (в версиях младше 2009 Delphi пункт называется DLL Wizard).

dll delphi библиотека

В результате у нас появляется лишь окно с кодом, заметьте никакой формы у нас здесь нет !
Теперь начинается самое интересное. Напишем наши первые процедуры в библиотеке.

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 человек ! Подписаться



Похожие материалы

Последние из рубрики

roker777 19 Nov 2011 в 00:00 #
Это не круто, ЭТО МЕГА КРУТО,спасибо за урок!!!!
Леонид 26 Oct 2011 в 00:00 #
помогите составить dllбиблиотеку функции f(x)=x*x+3*x и присоединить её к программе
Heartagram 29 Jul 2011 в 00:00 #
Максим, "Я уже и модуль добавлял unit2 in "unit2.pas""- после добавления пиши НЕ Label1.Caption:=?DelphiWorld?, А Form1.Label1.Caption:=?DelphiWorld?
Максим 21 Jul 2011 в 00:00 #
Урок замечательный !!!
Но у меня есть ода просьба, ребят подскажите мне надо из dll управлять компонентами на форме. Ну например вот у кнопки процедура из dll, а как сделать так, чтобы можно было управлять другими компонентами типо Label1.Caption:=′DalphiWorld′ вот как это написать в dll процедуре. Я уже и модуль добавлял unit2 in "unit2.pas"
вроде без ошибок но при использовании процедуры dll в процедуре кнопки действие Label1.Caption:=′DelphiWorld′ не выполняется, а такое, как ShowMessage(′DelphiWorld′) выполняется в случаи с Label пишет ошибка при чтении помогите добавить модуль формы правильно плизз.
Диман 25 Apr 2011 в 00:00 #
Подскажите пожалуйста как можно загрузить Dll до старта основной программы, то есть у меня основная программа содержится в Dll и есть еще одна програмка которая при запуске вызывает эту Dll. Суть вопроса в том как сделать чтобы эта программа вызывала все нужные в этот момен dll и они работали в основной программе?

ОтменитьДобавить комментарий