Delphi világ - megosztott könyvtárak

DLL

Dynamic Link Library (DLL - Dynamic Link Library) egy univerzális mechanizmus integrálása a programba eljárások és függvények által írt más programozók és általában eltérő Object Pascal, programozási nyelvek.

DLL vannak megvalósítva végrehajtható tartalmazó modulok kész munka eljárások, függvények, és / vagy a források. Egy programozó szemszögéből, sok a hasonlóság a DLL és szokás Object Pascal egységek, azaz a. A. Hosszú távon és a könyvtárak, és a modulok szállít rutinok, enyhíti a programozó saját kód írásával. De vannak alapvető különbségek. Amelyek közül a legfontosabb az, hogy a DLL nincs abban a helyzetben, hogy a program változók, konstansok, típusok, mert DLL alkotók használhatja, nem típusos programozási nyelvek, mint az assembly nyelvű. Ennek eredményeként a DLL nem lehet exportálni a programba, így a most szükséges programozó osztályok - csomagokat használnak erre a célra.

Dinamikus kapcsolat DLL ad nekik még egy fontos előnnyel modulok: módosítsa a DLL a legtöbb esetben nem igényel újrafordítás segítségével programját.

DLL szöveg szerkezetén szerkezetét követi a rendszeres program kivételével, hogy részben végrehajtható utasítások a DLL ugyanazt a szerepet játssza, mint a kezdeményezője a modul: ez a része a szereplők végre csak egyszer idején betöltése a könyvtár a memóriában. Az egymást követő kezelés követelményét betölteni a könyvtár növekszik annak valamelyik referencia száma, de nem vezet a végrehajtás a hajtódik végre.

Amellett, hogy a nevét, a szubrutin a DLL fejléc kerül, mint annak sorszámát, pontosabban jelöli egy indexet. Ez lehetővé teszi, hogy a hívó nem olvassa el a nevét és az index az alprogram, és ezáltal csökkenti a szükséges időt, hogy kapcsolatot létesítsen vele. Az index rendelhető rutin rendelést annak megjelenését a kivitel meg: az első rutin az első listát kap index 0, a következő - 1, stb programozó tudja változtatni a néma indexelési és egyértelműen meg kell határozni a szubrutin kódot, hozzátéve az ő neve exportja szólistában index és az egész .. előjel nélküli szám tartományban 0-32.767:

A programozó határozza meg a külső neve az exportált rutinok kivételével az igazi neve. Ehhez adjuk hozzá a szót export listához nevét és külső név közé aposztróf:

A hívó fél hivatkozhat a nevét vagy az exportált rutinok, vagy az index. Amikor hívja a program neve nézi a nevek a szimbólum táblát, hogy megtalálja a megfelelő. Mivel nevek állhat egy hosszú sor karakterek és maguk nevét a táblázatban lehet, hogy sok, a folyamat keres nevek lassabban, mint az index a keresési folyamat. Ezért a tapasztalt programozók inkább nem olvassa el a nevét egy szubrutin az index.

Megjegyzem, hogy ellentétben a Delphi modulok automatikusan lefordítja a DLL a build módban, vagy hogy, t. Hogy. A vásár látja, mint egy másik program, nem csatlakozik idején összeállításának a fő program.

Megjegyzés: minden DLL funkció használatához megállapodás stdcall, amely biztosítja a kompatibilitást az új funkciókat a Windows API 32. Nem adja meg ezt a megállapodást; Ebben az esetben a fordító fogja használni a hatékonyabb megállapodás nyilvántartásban, de a fellebbezést a DLL írt programok más programozási nyelvek általában lehetetlenné válna.

Ha létrehozott egy DLL „külső” isolzovaniya (vneDelphi) állapítsa meg a alprogram stdcall irányelv vagy safecall!

Ahhoz, hogy használni rutinok a DLL kell leírni őket a külső, hozzátéve, a szó külső könyvtár nevét az aposztróf:

Mint már említettük, a 'szubrutin név vagy index. A példánkban a MyDLL könyvtár alprogramot külső neve „murgos”. Ha meg kell utalni a alprogram kódja a könyvtár nevét jelöli a szó index és az index:

Ebben az esetben az a név, amely a szokásos jól ismert programok nem feltétlenül esik egybe a külső DLL-név. Azonban a programozó explicit felülírja a neve a szubrutin, akkor is, ha arra utal, hogy a külső neve:

Ebben a megvalósításban, azt feltételezzük, hogy az eljárás exportálják a külső neve „extname”.

13.4.1. statikus terhelés

A következő program a könyvtár Smpix leírt az előző oldalon.

Megjegyzés: cmpixAdd könyvtár funkciója van egy külső neve ADDC. Ez a helyzet (nagybetűvel) ezt a funkciót a fenti példában. Ha használt

linker nem tudta azonosítani azt.

13.4.2. dinamikus terhelés

A fent leírt módszer feladatainak meghatározásáról és DLL eljárásokat (a direktívák Külső) hatására a fordító, hogy a programban fejlécében listája DLL és rakodó betölti a könyvtár a memóriába miközben letölti a programot. A program képes betölteni a DLL használata nélkül a három külső

Alapfelszerelés. LoadLibrary, GetProcAddress és FreeLibrary.

A következő példa szemlélteti ezt a technikát betöltése DLL Cmplx:

13.4.3. interfész modul

Ez az interfész modul jelentősen egyszerűsíti a design a fő program: a mi példánkban ez biztosítja ugyanazt a felületet, hogy cmpix könyvtár modul cmpix létesítményeihez fent leírtak szerint.

Amikor hivatkozva a DLL rutinok írt más programozási nyelvek, akkor lehet, hogy a Külső alprogram karaktereket tartalmaz, amelyek nem tartják be a megfelelő azonosító Delphi. Például a C ++ nyelv lehetővé teszi, hogy használja a „@” karaktert azonosítókat. Ebben az esetben (és ha azt akarjuk átnevezni kivitt egy DLL rutin) szubrutin nevét jogot tekintve Delphi ID és adja meg a valódi nevét az alprogram szó után nevét. Például:

13.5. Rátérve KÖNYVTÁR FORMÁK

A következő példa a felvétele berendezések formájában DLL és használja a hívó programban.

A szöveg a formában egy DLL

A szöveg a hívó program

A modul formák DLLForm, helyezzenek el egy DLL utal, hogy a standard Forms modul, és így kapja meg a globális objektum alkalmazás, ami nem „nem tudom” a globális objektum hívóprogram (lásd. Fejezet. 21). A modális hívás módban ez nem számít, hogy van. Hogy. A modális ablak blokkolja a hívó. A nem-modális módban a hívást kell szinkronizálni az intézkedés tárgyak, különben a minimalizálása a fő ablakban, például nem vezet minimalizálásával windows DLL. A szinkronizálás érjük el a kilincset Application DLL tárgy helyébe a megfelelő leíró a hívó program.