Приклади створення складних у dll delphi. Створення та використання DLL у Delphi (прив'язка DLL до програми, динамічне завантаження). Області застосування DLL

У зв'язку з бурхливим розвитком технологій програмування все більше людей стикаються з проблемою нарощування можливостей своїх програм. Ця стаття присвячена саме цьому питанню, а саме – програмування DLL у Borland Delphi. Крім того, оскільки ми торкнемося питання щодо використання бібліотек DLL, то принагідно торкнемося імпортування функцій з чужих DLL (у тому числі і системних, тобто WinAPI).

Області застосування DLL

Отже, навіщо потрібні бібліотеки DLL і де вони використовуються?.. Перерахуємо лише деякі з областей їх застосування:

  • Окремі бібліотеки, що містять корисні для програмістів додаткові функції. Наприклад, функції для роботи з рядками, або складні бібліотеки для перетворення зображень.
  • Сховища ресурсів. У DLL можна зберігати не тільки програми та функції, але й різноманітні ресурси – іконки, малюнки, рядкові масиви, меню тощо.
  • Бібліотеки підтримки. Як приклад можна навести бібліотеки таких відомих пакетів, як: DirectX, ICQAPI(API для ICQ), OpenGLі т.д.
  • Частини програми. Наприклад, у DLL можна зберігати вікна програми (форми) тощо.
  • Плагіни(Plugins). - Ось де справжній простір для думок програміста! Плагіни – доповнення до програми, що розширює її можливості. Наприклад, у цій статті ми розглянемо теорію створення плагіна для програми.
  • Розділяється ресурс. DLL ( Dynamic Link Library) може бути використана відразу кількома програмами чи процесами (т.зв. sharing- Розділений ресурс)

Короткий опис функцій та прийомів для роботи з DLL

Отже, які ж прийоми та функції необхідно використовувати, щоб працювати з DLL? Розберемо два методи імпортування функцій із бібліотеки:

1 спосіб. Прив'язка DLL до програми.Це найбільш простий і легкий методдля використання функцій, що імпортуються з DLL. Однак (і на це слід звернути увагу) цей спосіб має дуже вагомий недолік – якщо бібліотека, яку використовує програма, не буде знайдена, то програма просто не запуститься, видаючи помилку та повідомляючи про те, що ресурс DLL не знайдено. А пошук бібліотеки вестиметься: у поточному каталозі, у каталозі програми, у каталозі WINDOWS\SYSTEM, і т.д.
Отже, спершу - загальна формацього прийому:

implementation
...
function FunctionName(Par1: Par1Type; Par2: Par2Type; ...): ReturnType; stdcall; external"DLLNAME.DLL" name"FunctionName" index FuncIndex;
// або (якщо не функція, а процедура):
procedure ProcedureName(Par1: Par1Type; Par2: Par2Type; ...); stdcall; external"DLLNAME.DLL" name"ProcedureName" index ProcIndex;

Тут: FunctionName(або ProcedureName) - ім'я функції (або процедури), яке використовуватиметься у Вашій програмі;
Par1, Par2, ...- імена параметрів функції чи процедури;
Par1Type, Par2Type, ...- типи параметрів функції або процедури (наприклад, Integer);
ReturnType- тип значення, що повертається (тільки для функції);
stdcall- директива, яка має точно збігатися з використовуваною в самій DLL;
external "DLLNAME.DLL"- директива, що вказує ім'я зовнішньої DLL, з якої буде імпортовано дана функціяабо процедура (у даному випадку - DLLNAME.DLL);
name "FunctionName" ("ProcedureName")- Директива, що вказує точне ім'я функції у самій DLL. Це необов'язкова директива, яка дозволяє використовувати в програмі функцію, що має назву, відмінну від істинної (яку вона має у бібліотеці);
index FunctionIndex (ProcedureIndex)- Директива, що вказує порядковий номерфункції або процедури в DLL. Це також необов'язкова директива.

2 спосіб. Динамічний завантаження DLL.Це набагато складніший, але й елегантніший метод. Він позбавлений нестачі першого методу. Єдине, що неприємно - обсяг коду, необхідного для здійснення цього прийому, причому складність у тому, що функція, що імпортується з DLL доступна лише тоді, коли ця DLL завантажена і знаходиться в пам'яті... З прикладом можна ознайомитися нижче, а поки що - короткий описвикористовуваних цим методом функцій WinAPI:

LoadLibrary(LibFileName: PChar) - завантаження вказаної бібліотеки LibFileName у пам'ять. При успішному завершенні функція повертає дескриптор ( THandle) DLL у пам'яті.
GetProcAddress(Module: THandle; ProcName: PChar) - зчитує адресу експортованої бібліотечної функції. При успішному завершенні функція повертає дескриптор ( TFarProc) функції в завантаженій DLL.
FreeLibrary(LibModule: THandle) - робить недійсним LibModule та звільняє пов'язану з ним пам'ять. Слід зазначити, що після цієї процедури функції цієї бібліотеки більше недоступні.

Практика та приклади

Ну а тепер настав час навести пару прикладів використання перерахованих вище методів і прийомів:

Тепер те саме, але другим способом - з динамічним завантаженням:

(... Тут йде заголовок файлу та визначення форми TForm1 та її екземпляра Form1)

var
Form1: TForm1;
GetSimpleText: function(LangRus: Boolean): PChar;
LibHandle: THandle;

procedure Button1Click(Sender: TObject);
begin
("Чистимо" адресу функції від "бруду")
@GetSimpleText:= nil;
(Намагаємося завантажити бібліотеку)
LibHandle:= LoadLibrary("MYDLL.DLL");
(Якщо все OK)
if LibHandle >= 32 then begin
(...то намагаємося отримати адресу функції у бібліотеці)
@GetSimpleText:= GetProcAddress(LibHandle,"GetSimpleText");
(Якщо тут все OK)
if @GetSimpleText<>nil then
(...то викликаємо цю функцію і показуємо результат)
ShowMessage(StrPas(GetSimpleText(True)));
end;
(І не забуваємо звільнити пам'ять та вивантажити DLL)
FreeLibrary (LibHandle);
end;

ПРИМІТКА : Слід утримуватись від використання типу string у бібліотечних функціях, т.к. при його використанні існують проблеми з "розподілом пам'яті". Докладніше про це можна прочитати (щоправда, англійською) у тексті порожнього проекту DLL, який створює Delphi (File -> New -> DLL). Так що краще використовуйте PChar, а потім за потреби конвертуйте його в string функцією StrPas.

А тепер розберемо безпосередньо саму бібліотеку DLL:

Розміщення в DLL ресурсів та форм

У DLL можна розміщувати як функції, а й курсори, малюнки, іконки, меню, текстові рядки. На цьому ми зупинятись не будемо. Зауважу лише, що завантаження ресурсу потрібно завантажити DLL, та був, отримавши її дескриптор, - завантажувати сам ресурс відповідної функцією (LoadIcon, LoadCursor, тощо.). У цьому розділі ми лише трохи торкнемося розміщення в бібліотеках DLL вікон програми (тобто форм у Дельфі).

Для цього потрібно створити нову DLL і додати до неї нову форму(File -> New -> DLL, а потім - File -> New Form). Далі, якщо форма є діалоговим вікном ( модальну форму(bsDialog)), то додаємо в DLL наступну функцію (припустимо, форма називається Form1, а її клас - TForm1):

Якщо ж потрібно розмістити в DLL немодальну форму, необхідно зробити дві функції - відкриття і закриття форми. При цьому потрібно змусити DLL запам'ятати дескриптор цієї форми.

Створення плагінів

Тут ми детально розглядати плагіни, т.к. Наведені вище приклади допоможуть Вам легко розібратися у левовій частині програмування DLL. Нагадаю лише, що плагін – доповнення до програми, що розширює її можливості. При цьому сама програма обов'язково має передбачати наявність таких доповнень та дозволяти їм виконувати своє призначення.

Тобто, наприклад, щоб створити плагін до графічному редактору, який би виконував перетворення зображень, Вам потрібно передбачити як мінімум дві функції в плагіні (і, відповідно, викликати ці функції в програмі) - функція, яка повертала б ім'я плагіна (і/або його тип), щоб додати цей плагін в меню ( або в тулбар), плюс головна функція- передачі та прийому зображення. Тобто. спочатку програма шукає плагіни, потім для кожного знайденого викликає його функцію опізнання зі строго певним ім'ям (наприклад, GetPluginName) і додає потрібний пунктв меню, потім, якщо користувач вибрав цей пункт - викликає другу функцію, якою передає вхідне зображення (або ім'я файлу, що містить це зображення), а ця функція, у свою чергу, обробляє зображення та повертає його в новому вигляді (або ім'я файлу з новим зображенням). Ось і вся сутність плагіна...

Епілог

У цій статті відображено основні сторони використання та створення бібліотек DLL у Borland Delphi. Якщо у Вас є питання – скидайте їх мені на E-mail: [email protected], а ще краще – пишіть у конференції цього сайту, щоб і інші користувачі змогли побачити Ваше запитання та спробувати на нього відповісти!

Карих Микола. Московська область, м. Жуковський

Динамічна бібліотека, або DLL, є сукупністю підпрограм (маленьких програм), які можуть викликатися додатками чи іншими DLL. Подібно до модулів, DLLмістить загальний кодабо ресурси, які можуть використовувати кілька додатків одночасно з одного екземпляра DLL. В сутності Windows- це просто сукупність DLL.

Природно, використовуючи Delphi, ми можемо також написати і використовувати наші власні DLLі можемо викликати функції в DLL, розробленому іншими розробниками та на інших системах (типу Visual Basic або C/C++).

Створення динамічної бібліотеки

Наступні кілька рядків демонструють, як створити простий DLLза допомогою Delphi.

Початківцям Дельфістампотрібно з меню вибрати File | New... DLL. Це створить шаблон нового DLLу вікні редактора. Виділіть заданий за замовчуванням текст і замініть його на наступний код:

Library TestLibrary; uses SysUtils, Classes, Dialogs; procedure DllMessage; export; begin ShowMessage("Hello world from a Delphi DLL") ; end; exports DllMessage; begin end.

Якщо Ви подивіться на файл проекту будь-якого програми Delphi, Ви побачите, що він починається з зарезервованого слова Program. DLLна відміну від цього, починається із зарезервованого слова Library. Потім це супроводжується пунктом usesдля будь-яких необхідних модулів. У цьому простому прикладі за цим слідує процедура на ім'я DllMessageяка не робить нічого, крім показу простого повідомлення.

Наприкінці цього тексту стоїть інструкція exports. Тут включено список підпрограм, які будуть експортовані з DLLі можуть викликатися іншими програмами. Це означає, що, наприклад, DLLзнаходиться 5 процедур і лише 2 з них (перерахованих у розділі exports) можуть викликатися з зовнішніх програм(3 з них підпрограми в DLL).

Щоб використати цей простий DLL, ми повинні скомпілювати його, натиснувши Ctrl+F9. Це створити DLLпо імені SimpleMessageDll.dllу папці проекту.


А тепер давайте подивимося, як викликати процедуру DllMessageіз (статично завантаженої) DLL.

Щоб імпортувати процедуру, що міститься в DLL, ми використовуємо ключове слово externalв оголошенні процедури. Наприклад, оголошення процедури DllMessage, показаної раніше, виглядала б так:

Procedure DllMessage; external "SimpleMessageDLL.dll"

А виклик процедури виглядає так:

DllMessage;

Повний код для форми Form1з TButtonпо імені Button1(для виклику функції DllMessage) виглядає так:

Unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject) ; private (Private declarations) public (Public declarations) end; var Form1: TForm1; procedure DllMessage; external "SimpleMessageDLL.dll" implementation ($R *.dfm) procedure TForm1.Button1Click(Sender: TObject) ; begin DllMessage; end; end.

Це все! Все просто, як і все в Delphi!

Здрастуйте, шановні колеги!

У цій статті я постараюся відповісти на запитання: Що таке DLL? Навіщо вона потрібна? І як створювати та використовувати DLLза допомогою Delphi.

Що таке DLL?

Dynamic Link Libraryабо скорочено DLL— це бібліотека, яка містить набір даних або функцій для використання в інших програмах.

Області застосування:

  • Зберігання ресурсів: іконки, звуки, курсори та ін. Економимо на розмірі виконуваних файлівоб'єднуючи ресурси у єдину бібліотеку.
  • Розміщення окремих модулів програми та форм інтерфейсу. Отримуємо можливість часткового оновлення програми, а при динамічному підключенні можна оновлювати модулі без перезапуску основної програми.
  • Використання як плагіни (PlugIn). Надаємо можливість розширювати функціонал програми без переписування основного коду програми.
  • Бібліотека може використовуватись на різних мовахпрограмування незалежно від мови якою вона була написана.

створення власної бібліотеки DLL.

Для створення бібліотеки заходимо у меню File -> Іншіі вибираємо Delphi Projects -> Dynamic-link Library.
Відкриється текст коду із заготівлею для створення бібліотеки:

Library Project1; uses System.SysUtils, System.Classes; ($R *.res) begin end.

Розміщення ресурсів

Додамо іконку до бібліотеки, яку будемо використовувати потім в основній програмі.
Як додавати ресурси до проекту докладно описано у статті.

Додамо форму «Про програму».
Натискаємо File -> New -> VCL Form. Додамо текст та кнопку «ОК»:

Додамо функцію, яка виводитиме стандартний MessageBoxз питанням, кнопками «Так», «Ні» та з результатом у вигляді Trueабо False.

Function YesNoDlg(const Question: PChar): boolean; stdcall; begin Result:= (MessageBox(0, Question, "Підтвердження", MB_YESNO + MB_ICONQUESTION) = ID_YES); end;

Зверніть увагу на ключове слово stdcall. Воно визначає, як саме будуть передаватися параметри та результати під час виклику функцій. Докладніше можна прочитати на сторінці wiki Угода про виклик.

Також додамо процедуру, яка буде використовуватися як плагін для основної програми. Яка буде додавати кнопку "Про програму" в основне меню програми для виклику створеного нами вікна.
Код процедури:

Procedure PlugIn(Form: TForm); stdcall; var i: integer; mi: TMenuItem; begin for i:= 0 до Form.ComponentCount - 1 do begin if (Form.Components[i].ClassName = "TMenuItem") and (Form.Components[i].Name = "miHelp") then begin mi:= TMenuItem . Create (Form. Components [i]); mi.Caption:= "Про програму"; mi.OnClick:= fmAbout.onAboutButtonClick; TMenuItem(Form.Components[i]).Add(mi); Exit; end; end; end;

У процедуру як параметр передається форма програми. Ми перевіряємо чи є на ній пункт меню з ім'ям « miHelpі якщо меню знайшлося, то додаємо в нього свою кнопку.

Тепер вкажемо, які функції та процедури можна використовувати з нашої бібліотеки.
Додамо рядок:

Exports PlugIn, YesNoDlg;

Скомпілюємо функцію Project -> Buildабо за допомогою гарячої клавіші Shift+F9.
Якщо помилок у коді немає, то в папці проекту має з'явитися файл із розширенням DLL.

Тепер перейдемо до створення програми, яка використовуватиме нашу бібліотеку.

У додатку створимо форму Mainв якій додамо компонент із наступними кнопками: Програма -> Вихід та Допомога. Для останнього задамо ім'я miHelp:

Перейдемо до коду форми.

Функції з бібліотеки DLLможна підключати двома способами:
Статичним— бібліотека підключається під час запуску програми. Якщо бібліотека або ім'я функції не знайдено, програма видасть помилку і не запуститься.
Динамічним— бібліотека підключається безпосередньо перед викликом функції або за певною подією.

Розглянемо статичний спосіб підключення:

Type TfmMain = class(TForm) MainMenu: TMainMenu; miProgram: TMenuItem; miExit: TMenuItem; miHelp: TMenuItem; procedure FormCreate(Sender: TObject); procedure miExitClick(Sender: TObject); private public end; procedure PlugIn(Form: TForm); stdcall; external "SampleDLL.dll"; var ...

Ключове слово externalвказує на те, що ця функція підключається із зовнішньої бібліотеки.

на подію onCreateформи додамо виклик процедури PlugIn:

Procedure TfmMain.FormCreate(Sender: TObject); begin PlugIn(Self); end;

Як параметр Formпередаємо у процедуру поточну форму (ключове слово Self).

Під час запуску програми у нас має з'явитися пункт «Про програму» у розділі «Допомога» головного меню.

Переходимо до динамічного способу підключення.

Нам знадобляться три функції WinApi:

LoadLibrary
Завантажує бібліотеку на згадку про комп'ютер. Як результат повертає покажчик на бібліотеку у пам'яті. У разі помилки поверне 0.

LoadLibrary(lpLibFileName: LPCWSTR): HMODULE;

lpLibFileName- Ім'я файлу бібліотеки.

GetProcAddress
Знайти функцію в бібліотеці на ім'я. Результатом буде вказівник на функцію. Якщо функцію не знайдено, то поверне nil.

GetProcAddress(hModule: HMODULE; lpProcName: LPCSTR): FARPROC;

hModule
lpProcName- Ім'я функції.

FreeLibrary
Вивантажує бібліотеку з пам'яті комп'ютера. Результатом буде True у разі успішного виконання та False у разі помилки.

FreeLibrary(hLibModule: HMODULE): BOOL;

hLibModule— Покажчик на завантажену бібліотеку.

Тепер за допомогою динамічного способу отримаємо ресурси, нашу іконку та на кнопку «Вихід» додамо виклик функції YesNoDlgдля підтвердження закриття програми.
На ту ж подію onCreate додаємо код:

Procedure TfmMain.FormCreate(Sender: TObject); var DLLHandle: THandle; begin PlugIn(Self); DLLHandle:= LoadLibrary("SampleDLL.dll"); if DLLHandle = 0 then raise Exception.Create("Не вдалося підключити бібліотеку "SampleDLL"!"); try Self.Icon.LoadFromResourceName(DLLHandle, "my_icon"); finally FreeLibrary(DLLHandle); end; end;

І на подію onClickпункту меню «Вихід»:

Procedure TfmMain.miExitClick(Sender: TObject); var DLLHandle: THandle; Dlg: function(const Question: PChar): boolean; stdcall; begin DLLHandle:= LoadLibrary("SampleDLL.dll"); if DLLHandle = 0 then raise Exception.Create("Не вдалося підключити бібліотеку "SampleDLL"!"); try @Dlg:= GetProcAddress(DLLHandle, "YesNoDlg"); if not Assigned(@Dlg) then raise Exception.Create("Функція з ім'ям "YesNoDlg" не знайдена в бібліотеці "SampleDLL"!"); if Dlg("Вийти з програми?") then Close; finally FreeLibrary(DLLHandle); end; end;

Якщо ви все написали правильно, то після запуску програми повинна помінятися іконка форми, додати кнопку «Про програму», при натисканні на яку буде показувати форму Aboutі на натискання кнопки вихід програма запитуватиме підтвердження: «Вийти з програми?».

Сподіваюся вам буде корисним цей невеликий приклад використання можливостей 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 першої кнопки:


Begin
FirstCall;
End;

OnClick другої кнопки:


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");
//Отримуємо покажчик на об'єкт
/ / Перший параметр посилання на модуль бібліотеки
//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;

От і все! Другий спосіб вийшов досить громіздкий, але його плюс в уточненні об'єкта, що зберігається в бібліотеці.

P.S. Хочете вперед решти відвідувачів сайту отримувати свіжі Відео уроки, Аудіо подкасти, статті по Delphi.
Брати участь у конкурсах і поступово вливатися до нашої команди?!
Тоді прямо зараз підписуйтесь на безкоштовну мультимедійну розсилку сайту
Нас уже понад 3500 осіб!