Споделени библиотеки - Delphi източници Често задавани въпроси
Динамична връзка библиотека (на DLL - Dynamic Link Library) е универсален механизъм за интегриране в програмните процедури и функции, написани от други програмисти и, като цяло, с изключение на Object Pascal, езици за програмиране.
DLL са реализирани като изпълними модули, съдържащи готови за работа процедури, функции и / или ресурси. От гледна точка на програмист, има много прилики между DLL и обичаен за Object Pascal единици, т.е.. А. В дългосрочен план и библиотеки, както и модули доставят съчетания, облекчаване на програмиста от писането на собствения си код. Но има и съществени разлики. Главен сред тях е, че DLL не е в състояние да осигури на програмата променливи, константи и видовете, защото създателите на DLL могат да използват без напечатани езици за програмиране като асемблер. В резултат на това DLL не могат да бъдат изнасяни в програмата, така необходими днес програмист класове - пакети се използват за тази цел.
Dynamic DLL връзка им дава една по-важно предимство пред модула: промените някоя DLL в повечето случаи не изисква компилация с помощта на програмата му.
DLL структура на текста следва структурата на редовната програма, с изключение тази секция изпълними оператори в DLL играе същата роля като инициатор на модула: тази част от операторите се изпълняват само веднъж по време на зареждане на библиотеката в паметта. Всеки следващ лечение с изискването да се зареди библиотеката се увеличава от един от референтната му брой, но не води до се извършва изпълнението на изявлението.
В допълнение към името на подпрограмата в заглавната част на DLL се поставя като неговия сериен номер, по-точно, определен от индекс цяло число. Това позволява на обаждащия се, не се отнася до името, а индексът на подпрограмата и по този начин да намали времето, необходимо да се установи връзка с него време. Индексът се определя на рутинен оглед на външния му вид в износа списъци: първата рутината в първия списък получава индекс 0, а в следващия - 1, и т.н. Програмистът може да промени мълчи индексирането и изрично посочете кода на подпрограма, добавяйки, на името й в Износът дума индекс списък и цялата .. неподписан число в диапазона 0-32767:
Програмистът може да определи външния името на изнесените съчетания, различни от истинското й име. За да направите това, добавете думата Износът списъка с имена и външни име в апострофи:
Отсрещната страна може да ползвате или името на изнесените съчетания, или неговия индекс. Когато се обадите на името на програмата, е посветен на имена в таблицата със символи, за да намерят най-подходящия. Тъй като имена могат да се състоят от един дълъг набор от знаци и самите имена в таблицата могат да бъдат много, процесът на търсене на имена по-бавно от индекса на процеса на търсене. Ето защо, опитни програмисти не предпочитат да се отнасят до името на подпрограма на индекса.
Бих искала да отбележа, че за разлика от модулите Delphi са автоматично съставя DLL в режим на натрупване или да направите, т. За. Панаирът го вижда като друга програма, не сте свързани към момента на съставянето на основната програма.
Забележка: всички наши DLL функции може да използват съгласие stdcall, което гарантира съвместимостта на нови функции с API на Windows 32. Не успяхме да посочите това споразумение; В този случай, компилаторът ще използва по-ефективно регистър споразумение, но призив към нашата DLL от програми, написани на други езици за програмиране като цяло ще стане невъзможно.
Ако сте създали DLL за "външни" isolzovaniya (vneDelphi), декларирам, подпрограма с stdcall директива или safecall!
За да използвате съчетания от DLL е необходимо да ги опише като външен, добавяйки, думата за външно име библиотека в апострофи:
Както вече споменахме, подпрограмата се нарича по име или индекс. В нашия пример на MyDLL библиотека подпрограма с външно име "мургите. Ако трябва да се обърнете към кода на подпрограма за име на библиотека показва индекса на думата, а индексът:
В този случай, наименованието, под което рутината е добре познати програми, не може да съвпада с неговия външен DLL-име. Въпреки това, програмистът може изрично да замени името на подпрограмата, дори ако то се отнася до външния й име:
В този вариант се приема, че процедурата се изнася към външния името "ExtName".
13.4.1. статично натоварване
Следващият Програмата използва библиотеката Smpix описано на предишната страница.
Забележка: Функцията cmpixAdd библиотека има външна име ADDC. Такъв е случаят (главни букви) описва тази функция в горния пример. Ако се използва
свръзка не може да го идентифицира.
13.4.2. динамично натоварване
Описаният по-горе метод за определяне на функциите и процедурите на DLL (с помощта на директиви външен) предизвика компилатора да се сложи в заглавната програма от списъка на всички DLL и товарач ще се зареди библиотеката в паметта дори при изтеглянето на програмата. Програмата може да се зареди DLL, без да използвате три External
Стандартното оборудване. LoadLibrary, GetProcAddress и FreeLibrary.
Следният пример илюстрира тази техника зарежда DLL Cmplx:
13.4.3. интерфейсен модул
Този интерфейс модул значително опростява дизайна на основната програма: в нашия пример, тя осигурява същия интерфейс за cmpix библиотека като модул cmpix на своите съоръжения, описани по-горе.
Когато се говори за съчетания DLL, написани на други езици за програмиране, може да е, че името на външен подпрограма съдържа знаци, които не могат да се съхраняват в правилния идентификатор Delphi. Например, C ++ език позволява да се използва "@" герой в идентификатори. В този случай (и ако искате да преименувате, изнесени от DLL рутинна а) име подпрограма никакво право по отношение на Delphi ID и въведете истинското име на подпрограмата след името на думата си. Например:
13.5. Що се отнася до БИБЛИОТЕКА ФОРМИ
Следният пример илюстрира включването на оборудване под формата на DLL и да го използвате в програмата за разговори.
Текстът на формата в DLL
Текстът на викащата програма
DLLForm модула форми, поставени в DLL, се отнася до модула стандартни форми и по този начин получава свой глобален обект Заявление, което не е нищо "не знам" за глобалното обект наричайки програма (вж. Гл. 21). Режимът на модален разговор, това няма значение, това е. Да. модалните прозорец блокове на обаждащия се. Режимът на не-модален, разговорът трябва да бъде да се синхронизира действията на обекти, в противен случай минимизиране на главния прозорец, например, няма да доведе до минимизиране на прозорци DLL. Синхронизацията се осъществява чрез ръкохватка DLL Application обект се заменя със съответния Характеристиката на програмата за разговори.