Пятница, 24.10.2025, 04:04
Приветствую Вас Гость | RSS
Главная | Статьи | Регистрация | Вход
Меню сайта
Категории раздела
Базы данных [11]
Мультимедиа [2]
Графика [2]
Защита [0]
Математика [0]
Сеть-интернет [1]
Система [4]
Разное [4]
Поиск
Вход на сайт
Наш опрос
Оцените мой сайт
Всего ответов: 7
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Мой сайт
Главная » Статьи » Разное [ Добавить статью ]

Работа с 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 способ )



Источник: http://delphisources.at.ua/publ/sistema/raznoe/rabota_s_dll_bibliotekami/47-1-0-580#
Категория: Разное | Добавил: maxim-pogasim (02.09.2015)
Просмотров: 266 | Теги: Delphi и dll | Рейтинг: 0.0/0
Всего комментариев: 0
avatar
Программистами не рождаются.Copyright BPC Team © 2014 - 2025

Хочу сжечь на костре этот дебильный Хостинг от uCozЯндекс.Метрика