Vytváření knihoven DLL jazyka C/C++ v sadě Visual Studio

Ve Windows je dynamická knihovna (DLL) druh spustitelného souboru, který funguje jako sdílená knihovna funkcí a prostředků. Dynamické propojení je funkce operačního systému. Umožňuje spustitelnému souboru volat funkce nebo používat prostředky uložené v samostatném souboru. Tyto funkce a prostředky je možné zkompilovat a nasadit odděleně od spustitelných souborů, které je používají.

Knihovna DLL není samostatný spustitelný soubor. Knihovny DLL se spouštějí v prostředí aplikací, které je volají. Operační systém načte knihovnu DLL do paměti aplikace. Provádí se buď při načtení aplikace (implicitní propojení), nebo na vyžádání za běhu (explicitní propojení). Knihovny DLL také usnadňují sdílení funkcí a prostředků mezi spustitelnými soubory. Více aplikací má přístup k obsahu jedné kopie knihovny DLL ve stejnou dobu v paměti.

Rozdíly mezi dynamickým propojením a statickým propojením

Statické propojení zkopíruje veškerý kód objektu ve statické knihovně do spustitelných souborů, které ho používají při jejich sestavení. Dynamické propojení obsahuje pouze informace potřebné systémem Windows za běhu k vyhledání a načtení knihovny DLL, která obsahuje datovou položku nebo funkci. Při vytváření knihovny DLL vytvoříte také knihovnu importu, která obsahuje tyto informace. Když sestavujete spustitelný soubor, který volá knihovnu DLL, linker používá exportované symboly v importní knihovně k uložení těchto informací podpůrnému systému Windows. Když zavaděč načte knihovnu DLL, ta se mapuje do paměťového prostoru vaší aplikace. Pokud je k dispozici, je speciální funkce v knihovně DLL DllMain volána k provedení jakékoli inicializace, kterou knihovna DLL vyžaduje.

Rozdíly mezi aplikacemi a knihovnou DLL

I když knihovny DLL a aplikace jsou oba spustitelné moduly, liší se několika způsoby. Nejzjevnější rozdíl spočívá v tom, že nelze spustit knihovnu DLL. Z pohledu systému existují dva základní rozdíly mezi aplikacemi a knihovnou DLL:

  • Aplikace může mít současně spuštěno více instancí v systému. Knihovna DLL může mít pouze jednu instanci.

  • Aplikaci lze spustit jako proces. Může vlastnit například zásobník, vlákna provádění, globální paměť, popisovače souborů a frontu zpráv. Knihovna DLL nemůže tyto věci vlastnit.

Výhody používání knihoven DLL

Dynamické propojení s kódem a prostředky nabízí několik výhod oproti statickému propojení:

  • Dynamické propojení šetří paměť a snižuje swapování. Mnoho procesů může současně používat knihovnu DLL, přičemž sdílejí jednu kopii částí knihovny DLL pouze pro čtení v paměti. Naproti tomu každá aplikace vytvořená pomocí staticky propojené knihovny má úplnou kopii kódu knihovny, který systém Windows musí načíst do paměti.

  • Dynamické propojení šetří místo na disku a šířku pásma. Mnoho aplikací může sdílet jednu kopii knihovny DLL na disku. Naproti tomu každá aplikace vytvořená pomocí knihovny statických odkazů má kód knihovny propojený s jeho spustitelným obrázkem. To využívá více místa na disku a vyžaduje více šířky pásma pro přenos.

  • Údržba, opravy zabezpečení a upgrady můžou být jednodušší. Když vaše aplikace používají běžné funkce v knihovně DLL, můžete implementovat opravy chyb a nasadit aktualizace do knihovny DLL. Při aktualizaci knihoven DLL nemusí být aplikace, které je používají, rekompilovány ani znovu propojeny. Mohou využít novou knihovnu DLL hned po nasazení. Naproti tomu když provedete opravy v staticky propojeném kódu objektu, musíte znovu připojit a znovu nasadit každou aplikaci, která ji používá.

  • Knihovny DLL můžete použít k poskytování podpory po prodeji. Například knihovnu DLL ovladače zobrazení lze upravit tak, aby podporovala zobrazení, které nebylo při odeslání aplikace k dispozici.

  • Explicitní propojení můžete použít ke zjišťování a načítání knihoven DLL za běhu. Například rozšíření aplikací, která do aplikace přidávají nové funkce bez opětovného sestavení nebo opětovného nasazení.

  • Dynamické propojení usnadňuje podporu aplikací psaných v různých programovacích jazycích. Programy napsané v různých programovacích jazycích mohou volat stejnou funkci DLL, pokud programy dodržují konvenci volání funkce. Programy a funkce knihovny DLL musí být kompatibilní následujícími způsoby: Pořadí, ve kterém funkce očekává, že se argumenty budou vkládat do zásobníku. Zda je funkce nebo aplikace odpovědná za vyčištění zásobníku. Zda jsou v registrech předány nějaké argumenty.

  • Dynamické propojení poskytuje mechanismus pro rozšíření tříd knihovny microsoft Foundation Class (MFC). Můžete odvodit třídy z existujících tříd MFC a umístit je do knihovny DLL rozšíření MFC pro použití v aplikacích MFC.

  • Dynamické propojení usnadňuje vytváření mezinárodních verzí vaší aplikace. Knihovny DLL představují pohodlný způsob, jak poskytnout zdroje specifické pro lokalitu, což výrazně usnadňuje tvorbu mezinárodních verzí aplikací. Místo distribuce mnoha lokalizovaných verzí vaší aplikace můžete řetězce a obrázky pro každý jazyk umístit do samostatné knihovny prostředků DLL. Aplikace pak může načíst příslušné prostředky pro danou lokalitu během běhu.

Potenciální nevýhodou použití knihoven DLL je, že aplikace není samostatná. Závisí na existenci samostatného modulu DLL: modul, který musíte nasadit nebo ověřit sami v rámci instalace.

Další informace o vytváření a používání knihoven DLL

Následující články obsahují podrobné informace o vytváření knihoven DLL C/C++ v sadě Visual Studio.

Návod: Vytvoření a použití dynamické knihovny odkazů (C++)
Popisuje, jak vytvořit a použít knihovnu DLL v sadě Visual Studio.

Typy knihoven DLL
Poskytuje informace o různých typech knihoven DLL, které lze vytvořit.

Nejčastější dotazy k knihovně DLL
Poskytuje odpovědi na nejčastější dotazy týkající se knihoven DLL.

Propojení spustitelného souboru s knihovnou DLL
Popisuje explicitní a implicitní propojení s knihovnou DLL.

Inicializovat knihovnu DLL
Popisuje kód inicializace knihovny DLL, který se musí spustit při načtení knihovny DLL.

Knihovny DLL a chování běhové knihovny Microsoft C++
Popisuje sekvenci spuštění runtime knihovny DLL.

LoadLibrary a AfxLoadLibrary
Diskutuje použití LoadLibrary a AfxLoadLibrary k explicitnímu propojení s knihovnou DLL při za běhu.

getProcAddress
Popisuje použití GetProcAddress k získání adresy exportované funkce v knihovně DLL.

FreeLibrary a AfxFreeLibrary
Popisuje použití FreeLibrary a AfxFreeLibrary kdy už modul DLL není potřeba.

Pořadí vyhledávání dynamických linkovaných knihoven
Popisuje cestu hledání, kterou operační systém Windows používá k vyhledání knihovny DLL v systému.

Stavy modulů běžné knihovny MFC DLL dynamicky propojené s knihovnou MFC
Popisuje stavy modulu běžné knihovny MFC DLL dynamicky propojené s knihovnou MFC.

Rozšíření DLL MFC
Vysvětluje knihovny DLL, které obvykle implementují opakovaně použitelné třídy odvozené z existujících tříd MFC.

Vytvoření DLL knihovny obsahující pouze prostředky
Popisuje knihovnu DLL, která obsahuje pouze prostředky jako ikony, bitmapy, řetězce a dialogová okna.

Lokalizované prostředky v aplikacích MFC: Satelitní knihovny DLL
Rozšiřuje podporu pro satelitní knihovny DLL, funkci, která pomáhá při vytváření aplikací lokalizovaných do více jazyků.

Import a export
Popisuje import veřejných symbolů do aplikace nebo export funkcí z knihovny DLL.

Aktivní technologie a knihovny DLL
Umožňuje implementaci objektových serverů uvnitř knihovny DLL.

Automatizace v knihovně DLL
Popisuje, co nabízí možnost automatizace v průvodci knihovny MFC DLL.

Konvence pojmenování pro MFC DLL
Popisuje, jak knihovny DLL zahrnuté v MFC dodržují strukturované pojmenovávací konvence.

Volání funkcí knihovny DLL z aplikací jazyka Visual Basic
Popisuje způsob, jak volat funkce knihovny DLL z aplikací Visual Basic.

Použití knihovny MFC jako součásti knihovny DLL
Popisuje běžné knihovny MFC DLL, které umožňují používat knihovnu MFC jako součást knihovny dynamického propojení systému Windows.

Verze DLL knihovny MFC
Popisuje, jak můžete používat MFCxx.dll a MFCxxD.dll (kde x je číslo verze MFC) sdílené knihovny dynamického propojení s aplikacemi MFC a rozšiřujícími knihovnami MFC.