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

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

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



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

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

    Услуги таможенного агента во Владивостоке 20 Apr 2021 в 15:17 #
    Таможенный агент Азия-Трейдинг осуществляет прямые закупки товаров в странах Азии, Китай, Япония и Корея. Организовывает доставку товаров от двери до двери с последующим проведением таможенной очистки во Владивостоке. Минимальные сроки поставки товара в любой регион России при минимальных ценах. Поставки товаров осуществляются от любого производителя, предварительно проводим анализ и расчет стоимости товара на Вашем складе.
    Услуги растаможки во Владивостоке 13 Apr 2021 в 14:40 #
    Таможенная компания "Азия-Трейдинг" оказывает услуги таможенного оформления и транспортной логистики грузов, прибывающих в морские порты Владивостока из Китая, Кореи и Японии. Специалисты нашей компании осуществляют постоянный контроль за прибывающими грузами в адрес нашей компании и компаний наших клиентов с ежедневным уведомлением о состоянии груза и его локации.
    Платим за лайки! - Выплаты по требованию! 01 Jun 2017 в 19:26 #
    Наш сервис предоставляет настоящие лайки на фото заказчиков, которые готовы платить за качество.

    Именно для этого мы и набираем удалённых сотрудников, которые будут выполнять работу, то есть ставить лайки и получить за это деньги.

    Чтобы стать нашим удалённым сотрудником и начать ставить лайки, зарабатывая при этом 45 рублей за 1 поставленный лайк,

    достаточно просто зарегистрироваться на нашем сервисе. > oplata-vklike.tk
    Вывод заработанных средств ежедневно в течении нескольких минут.
    Мы платим за лайки! - Ежедневные выплаты! 31 May 2017 в 22:56 #
    Наш сервис предоставляет настоящие лайки на фото заказчиков, которые готовы платить за качество.

    Именно для этого мы и набираем удалённых сотрудников, которые будут выполнять работу, то есть ставить лайки и получить за это деньги.

    Чтобы стать нашим удалённым сотрудником и начать ставить лайки, зарабатывая при этом 45 рублей за 1 поставленный лайк,

    Вам достаточно просто зарегистрироваться на нашем сервисе. > oplata-vklike.tk
    Вывод заработанных средств ежедневно в течении нескольких минут.
    Мы платим за лайки! - Оплата ежедневно! 19 Apr 2017 в 17:34 #
    Наш сервис предоставляет настоящие лайки на фотографии заказчиков, которые готовы платить за качество.

    Именно для этого мы и набираем удалённых сотрудников, которые будут выполнять работу, то есть ставить лайки и зарабатывать за это деньги.

    Чтобы стать нашим удалённым сотрудником и начать ставить лайки, зарабатывая при этом 45 рублей за 1 поставленный лайк,

    Вам достаточно просто зарегистрироваться на нашем сервисе. > like-rabota.tk
    Вывод заработанных средств ежедневно в течении нескольких минут.

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