DLL: Porovnání verzí

Smazaný obsah Přidaný obsah
Bez shrnutí editace
Bez shrnutí editace
Řádek 1:
'''Dynamic-link library (DLL)''' neboli dynamicky linkovaná knihovna je implementace koncepce [[Knihovna (programování)#Dynamické knihovny|sdílených knihoven]] od společnosti [[Microsoft]] na operačních systémech [[Microsoft Windows]] a [[OS/2]]. Tyto knihovny obvykle používají [[Přípona souboru|příponu]] <tt>DLL</tt>, <tt>OCX</tt> (pro [[ActiveX]] prvky) nebo <tt>DRV</tt> (pro staré [[Ovladač zařízení|systémové ovladače]]).
#REDIRECT [[Knihovna (programování)]]
Formát DLL souborů je stejný jako v případě [[EXE]] souborů, tedy [[Portable Executable]] (PE) pro [[32bitový|32-bitové]] a [[64bitový|64-bitové]] Windows nebo [[New Executable]] (NE) pro [[16bitový|16-bitové]] Windows. Stejně jako EXE soubory, mohou DLL obsahovat [[Kód|kód]], [[Data|data]] a zdroje v libovolné kombinaci.
 
== Historie DLL souborů ==
 
V prvních verzích operačního systému [[Microsoft Windows]] byly všechny procesy spouštěny v jednom [[Správa paměti#Adresový prostor procesu|adresovém prostoru]] a díky [[Multitasking#Nepreemptivní multitasking|kooperativnímu multitaskingu]] se procesy explicitně vzdávali procesoru. Všechny operace na úrovni operačního systému poskytoval [[MS-DOS]], zatímco všechny vysokoúrovňové služby poskytovaly '''dynamicky linkované knihovny'''. API pro vykreslování [[Graphics Device Interface|GDI]] bylo implementováno v DLL zvané <tt>GDI.EXE</tt> a uživatelské rozhraní v <tt>USER.EXE<tt>. Tyto vrstvy nad DOSem byly sdílené pro všechny běžící procesy ovšem nikoliv s cílem provozovat systém na strojích s méně než jedním megabajtem paměti, ale s cílem umožnit procesům vzájemně spolupracovat. Kód [[Graphics Device Interface|rozhraní grafického zařízení]] v GDI překládal příkazy pro vykrelování specifickým zařízením. V případě displeje bylo manipulováno s pixely ve frame bufferu, v případě tiskárny byly příkazy transformovány na požadavky tiskárně. Aby GDI mohlo pracovat s různými zařízeními, načítaly se do paměti části kódu nazývané '[[Ovladač zařízení|ovladače zařízení]]'.
 
Stejná architektura, pomocí které GDI načítalo ovladače pro různá zařízení, umožnila systému načíst programy tak, že bylo možné z těchto programů volat API funkce knihoven USER a GDI. Tento koncept se nazývá ''dynamické linkování''.
 
U nesdílených, tedy ''statických'', knihovnen se jejich kód jednoduše ve fázi ''linkování'' přidává do programů, které příslušný kód volají. Pokud více programů volají stejnou rutinu, bude kód této rutiny přidán do obou programů. V případě dynamického linkování je sdílený kód umístěn do separátního souboru. Programy jsou s těmito soubory spojeny dynamicky pomocí operačního systému.
 
DLL soubory poskytují standardní výhody [[Knihovna (programování)#Dynamické knihovny|sdílených knihoven]], mezi které patří zejména [[Modularita|modularita]]. Modularita umožňuje provést změny v jedné knihovně sdílené více aplikacemi bez nutnosti tyto aplikace modifikovat. Další přínos modularity je v možnosti použití generického rozhraní pro zásuvné moduly. Rozhraní umožňuje integraci různých modulů do již existujících aplikací opět bez nutnosti aplikace modifikovat. Tento koncept dynamické rozšiřitelnosti je hojně využíván v [[Component Object Model|Component Object Model]].
 
V systému Windows 1.x, 2.x a 3.x všechny okenní aplikace sdílejí adresový prostor, do kterého jsou DLL načteny pouze jednou. Data těchto knihoven jsou pak sdílena všemi applikacemi, což mohlo být využito k nepřímé [[Meziprocesová komunikace|meziprocesové komunikaci]] ale také to mohlo vést k poškození nějaké aplikace. Od [[Windows 95]] pak každý proces měl svůj vlastní adresový prostor. Zatímco kód dynamických knihoven může být sdílen, data jsou privátní s výjimkou explicitního vyžádání ze strany knihovny.
 
I když se DLL knihovny staly jádrem architektury systému Windows, mají mnoho nedostatků, které se souhrnně nazývají "[[DLL hell]]".<ref name=DLL_Hell>{{cite web
| title = The End of DLL Hell
| publisher = Microsoft Corporation
| url = http://msdn.microsoft.com/en-us/library/ms811694.aspx
| accessdate = 2009-07-11}}</ref>
V současné době Microsoft poskytuje několik řešení DLL hell. Patří mezi ně platforma [[Microsoft .NET]] nebo virtualizaci založenou na [[Microsoft Virtual PC]] a [[Microsoft Application Virtualization]] protože nabízí vysoký stupeň izolace aplikací. Dalším řešením pak je implementace [[Side-by-Side Assembly]].
 
== Vlastnosti DLL souborů ==
=== Správa paměti ===
Ve [[Win32]] jsou DLL soubory organizovány do ''sekcí'', kde každá sekce obsahuje atributy informující o tom, zda je například v sekci povolen zápis nebo je pouze pro čtení a také zda je vykonatelná (pro kód) nebo není (pro data).
 
Kód v DLL knihovnách je obvykle sdílen všemi procesy, které tyto knihovny využívají. Knihovny jsou tak ve fyzické paměti načteny pouze jednou a nejsou odkládány do [[Stránkování paměti|stránkovacího souboru]].
 
Datové sekce jsou obvykle privátní, takže procesy využívající DLL mají vlastní kopii všech dat knihovny. Datové sekce lze ovšem sdílet a využít je k [[Meziprocesová komunikace|meziprocesové komunikaci]], což může být [[Zranitelnost|bezpečnostní zranitelnosto]], protože poškození sdílených dat může způsobit nepřijatelné chování jiných procesů, které tyto data používají. Například proces běžící pod účtem hosta může pomocí sdílených dat ovládnout jiný proces běžící s vyššími právy. Tento fakt je důvod k upuštění od sdílených datových sekcí v DLL knihovnách.
 
=== Rozlišení a importování funkcí ===
Každá funkce exportovaná DLL knihovnou je identifikována číslem a volitelně i jménem. Stejně tak může být funkce importována z DLL buď na základě čísla nebo jména. Číslo reprezentuje pozici ukazatele funkce v tabulce adres exportovaných funkcí a je běžné, že interní funkce jsou exportované pouze svým číslem. Ve Windows API se pak ve většině případů zachovávají mezi verzemi názvy, zatímco pořadí se může měnit, takže se nelze na takový import spoléhat.
 
Import funkcí pomocí pořadí není o moc rychlejší, protože tabulka exportovaných funkcí je seřazena podle jména, takže k nalezení funkce lze použít [[Binární vyhledávání|binární vyhledávání]]. V 16-bitových verzích systému Windows nebyla tabulka řazena, takže vyhledání mohlo být o něco pomalejší.
 
Je možné ''vázat'' spustitelný soubor na konkrétní verzi knihovny a zjistit adresu importované funke již v době kompilace. V takovém případě uloží [[Linker|linker]] časovou značku a kontrolní součet knihovny, ze které se importuje. Windows pak za běhu zkontrolují, zda se požadovaná knihovna používá a pokud ano, obejde standardní proces importování. V opačném případě proběhne import klasickou cestou.
 
=== Odložené načtení ===
Normálně se aplikace využívající jistou knihovnu nespustí, pokud tato knihovna nemůže být nalezena. Nicméně aplikace může být linkována tak, že se systém nesnaží nalézt knihovnu ihned, ale až když je zavolána nějaká funkce knihovny.<ref>
{{cite web
| title = Linker Support for Delay-Loaded DLLs
| publisher=Microsoft Corporation
| url = http://msdn.microsoft.com/en-us/library/151kt790.aspx
| accessdate = 2009-07-11}}</ref>
V případě, že knihovna není nalezena, nelze ji načíst nebo konkrétní funkce neexistuje, vygeneruje operační systém [[Výjimka|výjimku]], kterou může aplikace zachytit a vhodně ošetřit. Pokud aplikace výjimku nezachytí, operační systém aplikaci ukončí s hlášením o chybě.
 
[[ar:مكتبة الربط الديناميكي]]
[[bg:DLL]]
[[ca:DLL]]
[[cv:DLL]]
[[en:Dynamic-link library]]
[[de:Dynamic Link Library]]
[[es:Biblioteca de enlace dinámico]]
[[ko:동적 링크 라이브러리]]
[[hi:डी एल एल]]
[[it:Dynamic-link library]]
[[he:Dynamic-Link Library]]
[[hu:Dinamikus csatolású könyvtár]]
[[nl:Dynamically Linked Library]]
[[ja:ダイナミックリンクライブラリ]]
[[no:Dynamic-Link Library]]
[[pl:DLL]]
[[pt:DLL]]
[[ru:DLL]]
[[si:DLL]]
[[simple:Dynamic-link library]]
[[sk:Dynamic-link library]]
[[sv:Dynamic-link library]]
[[uk:Dll]]
[[vi:DLL]]
[[zh:动态链接库]]