Използване на DLL в Delphi
Delphi, файлова система, DLL и добавки
- Концепцията за DLL
- Създаване на DLL в Delphi (експортиране)
- Използване на DLL в Delphi (импортиране)
- DLL файлове, които използват VCL обекти за работа с данни
- Изключения в DLL
- Концепцията за DLL
Program1 Program2 : : MyFunc(:) MyFunc(:) : : функционален код MyFunc код на функция MyFunc код на други функции код на други функции
В многозадачна среда подобен подход би бил най-малкото безразсъден, тъй като е очевидно, че огромен брой същите функции, отговорни за изчертаване на елементи на потребителския интерфейс, достъп до системни ресурси и т.н. би се дублирал напълно във всички приложения, което би довело до бързото изчерпване на най-скъпия ресурс – RAM. Като решение на проблема беше предложена концепцията за динамично свързване дори на UNIX-подобни платформи (виж фиг. 2).
Но каква е разликата между Dynamic Link Library (DLL) и обикновените приложения? За да се разбере това, е необходимо да се изяснят концепциите за задача (task), екземпляр (копие) на приложение (instance) и модул (module).
Когато изпълнява множество копия на едно и също приложение, Windows зарежда само едно копие на кода и ресурсите в RAM - модула на приложението, създавайки няколко отделни сегмента от данни, стек и опашка от съобщения (вижте Фигура 3), всеки набор от които е задача, в разбирането на Windows. Копието на приложението е контекстът, в който се изпълнява модулът на приложението.
DLL - библиотеката също е модул. Той се намира в паметта в едно копие и съдържа кодов сегмент и ресурси, както и сегмент с данни (вижте Фигура 4).
DLL е библиотека, за разлика от приложението, тя няма нито стек, нито опашка за съобщения.Функциите, поставени в DLL, се изпълняват в контекста на извикващото приложение, използвайки неговия стек. Но същите тези функции използват сегмента от данни на библиотеката, а не копието на приложението.
Благодарение на тази организация на DLL се постига спестяване на памет поради факта, че всички работещи приложения използват един DLL модул, без да включват определени стандартни функции в своите модули.
Често под формата на DLL се създават отделни набори от функции, комбинирани според една или друга логическа характеристика, подобно на това как концептуално се планират модулите (в смисъл на единица) в Pascal. Разликата е, че функциите от модулите на Pascal се свързват статично - на етапа на свързване, а функциите от DLL се свързват динамично, тоест по време на изпълнение.
Създаване на DLL в Delphi (експорт)
За програмиране на DLL, Delphi предоставя редица ключови думи и синтактични правила. Основното - DLL в Delphi е същият проект като програма.
Помислете за DLL шаблон:
Името на файла на проекта за такъв шаблон трябва да бъде MYDLL.DPR.
За съжаление само програмният проект се генерира автоматично в Delphi IDE, така че трябва да подготвите DLL проекта ръчно. Delphi 2.0 премахна това неудобство.
Подобно на програма, DLL има раздел за използване. Частта за инициализация не е задължителна. Разделът за експорти изброява функциите, които трябва да бъдат достъпни от външни приложения.
Експортирането на функции (и процедури) може да се извърши по няколко начина:
В зависимост от това се използва различен синтаксис:
Тъй като Windows има концепцията за „резидентни функции“ на DLL, т.е. тези функции, които са в паметта за целия живот на DLL в паметта, Delphi има съоръжения заорганизация и този вид износ:
Струва си да се отбележи, че търсенето на функции, експортирани по индекс, е по-бързо, отколкото при експортиране по име. От друга страна, експортирането по име е по-удобно, особено ако периодично допълвате и разширявате набора от функции, експортирани от DLL, като същевременно гарантирате работата на приложенията, използващи DLL, и не искате специално да наблюдавате спазването на уникалността и съвпадението на индекса.
Ако експортирате функции като тази:
Използване на DLL в Delphi (импортиране)
Да организира внос, т.е. Достъп до функции, експортирани от DLL, както и експортирането им, Delphi предоставя стандартни съоръжения.
За примерите, показани по-горе, вашата програма трябва да декларира функциите, импортирани от DLL, така:
Този метод се нарича статичен импорт.
Както може би сте забелязали, разширението на файла, съдържащ DLL, не е посочено - по подразбиране се приемат *.DLL и *.EXE файлове. И така, какво ще стане, ако файлът има различно разширение (като COMPLIB.DCL в Delphi) или ако трябва динамично да дефинирате DLL файлове и функции за импортиране (например вашата програма работи с различни графични формати и има отделен DLL за всеки от тях.)?
За да разрешите този вид проблем, можете да получите директен достъп до Windows API, като използвате така нареченото динамично импортиране:
Ако не говорим за кода, генериран от компилатора (сега той е по-оптимизиран), тогава всички правила на синтаксиса остават същите като в Borland Pascal 7.0
DLL файлове, които използват VCL обекти за манипулиране на данни
Изключения в DLL
Хвърлянето на изключение в DLL, създаден в Delphi, ще бъде прекратеноизпълнение на цялото приложение, ако тази ситуация не е била обработена в DLL. Ето защо е желателно да се предвидят всички възможни проблеми по време на разработването на DLL. Можем да препоръчаме връщане на резултата от импортираната функция като низ или число и, ако е необходимо, повторно повдигане на изключението в програмата.
Код в програмата:
СтатияИзползване на DLL в Delphi в раздела DLL файлова система и добавки може да бъде полезна за разработчиците на Delphi и FreePascal.
Коментари и въпроси
:: 2012-01-08 07:52:10 :: re: Използване на DLL в Delphi
Имам грешка "dll файлът не е намерен", направих всичко както трябва, няма грешки при компилирането, когато стартирам "dll файлът не е намерен", каква е уловката mb?
:: 2012-05-10 17:48:34 :: re: Използване на DLL в Delphi
DLL трябва да е в папката exe.