Vytváření knihoven DLL jazyka C/C++ v Visual Studio
V Windows je dynamická knihovna (DLL) druh spustitelného souboru, který funguje jako sdílená knihovna funkcí a prostředků. Dynamické propojení je schopnost 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ěly v kontextu aplikací, které je volají. Operační systém načte knihovnu DLL do paměťového prostoru 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ňuje sdílení funkcí a prostředků mezi spustitelnými soubory. Více aplikací může současně přistupovat k obsahu jedné kopie knihovny DLL 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 vytváření. Dynamické propojení obsahuje pouze informace potřebné Windows za běhu k vyhledání a načtení knihovny DLL, která obsahuje datovou položku nebo funkci. Když vytváříte knihovnu DLL, vytvoříte také knihovnu importu, která obsahuje tyto informace. Při sestavování spustitelného souboru, který volá knihovnu DLL, používá linker exportované symboly v knihovně importu k uložení těchto informací pro Windows zavaděče. Když zavaděč načte knihovnu DLL, namapuje se knihovna DLL do paměťového prostoru vaší aplikace. Pokud je k dispozici, je zavolána speciální funkce v knihovně DLL , která umožňuje DllMain provést inicializaci, která knihovna DLL vyžaduje.
Rozdíly mezi aplikacemi a dll
I když jsou knihovny DLL a aplikace spustitelné moduly, liší se několika způsoby. Nejzřetelnějším rozdílem je, že knihovnu DLL nelze spustit. Z pohledu systému existují dva základní rozdíly mezi aplikacemi a dll:
Aplikace může mít současně spuštěných více instancí sama v systému. Knihovna DLL může mít pouze jednu instanci.
Aplikaci je možné 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žití knihoven DLL
Dynamické propojení s kódem a prostředky nabízí oproti statickému propojení několik výhod:
Dynamické propojení šetří paměť a snižuje prohození. Mnoho procesů může používat knihovnu DLL současně a sdílet 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, kterou 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 její spustitelnou i image. To využívá více místa na disku a jeho přenos vyžaduje větší šířku pásma.
Údržba, opravy zabezpečení a upgrady mohou být jednodušší. Pokud 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 není nutné aplikace, které je používají, znovu zkompilovat ani znovu připojit. Mohou využít novou knihovnu DLL hned po nasazení. Naproti tomu když opravíte staticky propojený objektový kód, musíte znovu propojit a znovu nasadit každou aplikaci, která ho používá.
Knihovny DLL můžete použít k zajištění podpory po trhu. Knihovnu DLL ovladače zobrazení lze například upravit tak, aby podporovala zobrazení, které nebylo při odeslání aplikace k dispozici.
Ke zjišťování a načítání knihoven DLL za běhu můžete použít explicitní propojení. 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í napsaných v různých programovacích jazycích. Programy napsané v různých programovacích jazycích mohou volat stejnou funkci knihovny 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 argumenty budou do zásobníku naháněny. Jestli je funkce nebo aplikace zodpovědná za vyčištění zásobníku. A zda jsou v registrech předány nějaké argumenty.
Dynamické propojení poskytuje mechanismus pro rozšíření tříd knihovny MFC (Microsoft Foundation Class Library). Můžete odvodit třídy z existujících tříd MFC a umístit je do rozšiřující knihovny MFC DLL pro použití v aplikacích MFC.
Dynamické propojení usnadňuje vytváření mezinárodních verzí vaší aplikace. Knihovny DLL jsou pohodlným způsobem, jak dodávat prostředky specifické pro národní prostředí, což usnadňuje vytváření mezinárodních verzí aplikace. Místo přesouvání mnoha lokalizovaných verzí aplikace můžete umístit řetězce a obrázky pro každý jazyk do samostatné knihovny DLL prostředků. Aplikace pak může za běhu načíst příslušné prostředky pro toto národní prostředí.
Potenciální nevýhodou použití knihoven DLL je, že aplikace není samostatná. Závisí na existenci samostatného modulu knihovny DLL: modulu, 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 poskytují podrobné informace o vytváření knihoven DLL jazyka C/C++ v Visual Studio.
Návod: Vytvoření a použití dynamické knihovny DLL (C++)
Popisuje, jak vytvořit a použít knihovnu DLL v sadě Visual Studio.
Druhy knihoven DLL
Poskytuje informace o různých typech knihoven DLL, které lze vytvořit.
Nejčastější dotazy k knihovnám 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 inicializační kód 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 modulu run-time.
LoadLibrary a AfxLoadLibrary
Popisuje použití a LoadLibrary pro explicitní propojení s AfxLoadLibrary 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í a FreeLibrary , když modul DLL už není AfxFreeLibrary potřeba.
Pořadí hledání dynamické knihovny
Popisuje cestu hledání, kterou Windows operační systém používá k vyhledání knihovny DLL v systému.
Stavy modulů běžné knihovny MFC DLL dynamicky propojené do MFC
Popisuje stavy modulu běžné knihovny MFC DLL dynamicky propojené s MFC.
Rozšiřující knihovny MFC DLL
Vysvětluje knihovny DLL, které obvykle implementují znovu použitelné třídy odvozené z existujících tříd MFC.
Vytvoření knihovny DLL 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.
Technologie Active a knihovny DLL
Umožňuje implementovat objektové servery v knihovně 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.
Související oddíly
Použití knihovny MFC jako součásti knihovny DLL
Popisuje běžné knihovny MFC DLL, které umožňují používat knihovnu MFC jako Windows dynamické knihovny.
DLL verze knihovny MFC
Popisuje způsob použití sdílených dynamických knihoven MFCxx.dll a MFCxxD.dll (kde x je číslo verze knihovny MFC) s aplikacemi MFC a rozšiřujícími knihovnami DLL knihovny MFC.