Sdílet prostřednictvím


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 kontextu 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ž vytvoříte spustitelný soubor, který volá knihovnu DLL, linker použije exportované symboly v knihovně importu k uložení těchto informací pro zavaděč windows. Když zavaděč načte knihovnu DLL, knihovna DLL se mapuje do paměťového prostoru vaší aplikace. Pokud je k dispozici, speciální funkce v knihovně DLL , DllMainje volána k provedení jakékoli inicializace knihovny 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. Nejběžně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 v systému spuštěných více instancí současně. Knihovna DLL může mít pouze jednu instanci.

  • Aplikaci lze načíst 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 prohození. Mnoho procesů může současně používat knihovnu DLL, která sdílí jednu kopii částí knihovny DLL jen 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. Tím se využívá více místa na disku a přenos větší šířky pásma.

  • Ú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 uvedení na trh. 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 do zásobníku budou nasdílené argumenty. Ať už je funkce nebo aplikace zodpovědná za vyčištění zásobníku. A jestli 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 prostředky specifické pro národní prostředí, což usnadňuje vytváření mezinárodních verzí aplikace. Místo toho, abyste doručili mnoho lokalizovaných verzí aplikace, můžete řetězce a obrázky pro každý jazyk umístit do samostatné knihovny DLL prostředků. Aplikace pak může načíst příslušné prostředky pro dané národní prostředí za 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.

Inicializace knihovny 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 v jazyce Visual C++
Popisuje spouštěcí sekvenci knihovny DLL knihovny runtime.

LoadLibrary a AfxLoadLibrary
Popisuje použití LoadLibrary a AfxLoadLibrary explicitní propojení s knihovnou DLL 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í hledání dynamické knihovny
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.

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

Vytvoření knihovny DLL jen pro 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.

Zásady vytváření názvů pro knihovny MFC DLL
Popisuje, jak se knihovny DLL a knihovny zahrnuté v MFC drží zásady strukturovaného vytváření názvů.

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 knihovny MFC knihovny DLL
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.