DLL (библиотека на динамичните връзки) действа като споделена библиотека от функции, които могат да бъдат извиквани от множество приложения и други DLL файлове. Delphi ви позволява създавайте и използвайте DLL файлове така че можете да извиквате тези функции по желание. Трябва обаче да импортирате тези процедури, преди да можете да ги извикате.
Функциите, експортирани от DLL, могат да бъдат импортирани по два начина - или чрез деклариране на външна процедура или функция (статична) или чрез директни повиквания към специфични за DLL функции API (динамични).
Нека разгледаме проста DLL. По-долу е кодът за "circle.dll", експортиращ една функция, наречена "CircleArea", която изчислява площта на кръг, като използва дадения радиус:
След като разполагате с circle.dll, можете да използвате експортираната функция „CircleArea“ от приложението си.
Статично зареждане
Най-простият начин за импортиране на процедура или функция е декларирането й чрез външната директива:
Ако включите тази декларация в частта на интерфейса на единица, circle.dll се зарежда веднъж при стартиране на програмата. По време на изпълнението на програмата функцията CircleArea е достъпна за всички единици, които използват единицата, където е горната декларация.
Динамично зареждане
Можете да получите достъп до рутинни процедури в библиотека чрез директни обаждания към API на Win32, включително LoadLibrary, FreeLibrary, и GetProcAddress. Тези функции са декларирани в Windows.pas.
Ето как да извикаме функцията CircleArea, използвайки динамично зареждане:
При импортиране с помощта на динамично зареждане DLL не се зарежда до повикването към LoadLibrary. Библиотеката се разтоварва от обадете се до FreeLibrary.
При статично зареждане DLL се зарежда и секциите му за инициализация се изпълняват преди да бъдат изпълнени секциите за инициализация на извикващото приложение. Това се обръща с динамично натоварване.
Трябва ли да използвате статични или динамични?
Ето прост поглед върху предимствата и недостатъците както на статичното, така и на динамичното зареждане на DLL:
Статично зареждане
Професионалисти:
- По-лесно за начинаещ разработчик; не "грозен" API обаждания.
- DLL файловете се зареждат само веднъж, когато стартира програмата.
Недостатъци:
- Приложението няма да стартира, ако липсват DLL файлове или не могат да бъдат намерени. Ще се появи съобщение за грешка като това: „Това приложение не се стартира, тъй като 'липсва.dll» не бе намерен. Преинсталирането на приложението може да отстрани този проблем ". По дизайн, редът за търсене на DLL със статично свързване включва директорията, от която приложението заредена, системната директория, директория на Windows и директории, изброени в PATH среда променлива. Обърнете внимание също, че редът за търсене може да е различен за различните версии на Windows. Винаги очаквайте да има всички DLL файлове в директорията, в която е обаждащото се приложение.
- Използва се повече памет, тъй като всички DLL файлове са заредени, дори и да не използвате някои от функциите
Динамично зареждане
Професионалисти:
- Можете да стартирате програмата си дори когато някои от библиотеките, които използва, не присъстват.
- По-малка консумация на памет, тъй като DLL файловете се използват само когато е необходимо.
- Можете да определите пълния път към DLL.
- Може да се използва за модулни приложения. Приложението излага само (зарежда) модули (DLL), "одобрени" за потребителя.
- Възможността динамично да се зарежда и разтоварва библиотека, е основата на приставката, която позволява на програмиста да добавя допълнителна функционалност към програмите.
- Обратна съвместимост с по-стари версии на Windows, в които системните DLL файлове може да не поддържат същите функции или да се поддържат по същия начин. Първо откриването на версията на Windows, след което динамичното свързване въз основа на това, което работи приложението ви, ви позволява да поддържате повече версии на Windows и предлагат обходни решения за по-стари ОС (или най-малкото, изящно деактивиращи функции, които не можете поддържа.)
Недостатъци:
- Изисква повече код, който не винаги е лесен за начинаещ разработчик.