Jak dynamicky načíst dynamických knihoven (DLL) v systému Windows NT

Překlady článku Překlady článku
ID článku: 100635 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Souhrn

Při použití funkce LoadLibrary() v 16bitového systému Windows nebo OS/2, načte operační systém zadaná knihovna Dynamic-Link (DLL) pouze jednou. Proto DLL má stejnou adresu v každém procesu. Však dynamické načítání dll pracuje odlišně WINDOWSNT.

Operační systém načte DLL samostatně pro každý proces, protože každá aplikace má vlastní adresu místa v WINDOWSNT; adresový prostor je sdílena v 16bitového systému Windows a OS/2. Protože operační systém musí mapovat stránek adresní prostor pro každý proces, mohou být načteny DLL na jiné adresy v různých procesech. Správce paměti optimalizuje načítání tak, pokud dva procesy sdílet stejné stránky ze stejného obrázku DLL, mohou sdílet stejné fyzické paměti dll.

Každý DLL má upřednostňovaný základní adresu zadanou v okamžiku propojení. Pokud místo rozsah adres z upřednostňovaných základní adresu na základní adresu plus velikost obrázku není k dispozici, operační systém načte DLL někde jinde v paměti a použije opravy na jeho adresy. Neexistuje žádná metoda zadat adresu zatížení v okamžiku zatížení.

Sumarizovat, systém provede následující kroky v době zatížení:
  1. Prozkoumá obrázku a určí upřednostňovaný základní adresu a požadovaná velikost.
  2. Vyhledá požadované místo adresy a mapy obrázku, kopírování na zápisu, ze souboru.
  3. Jestliže obrázek není jeho upřednostňovaný základní adresu platí interní opravy.
  4. Opravuje nahoru importuje všechny dynamické propojení umístěním správnou adresu každé funkce importované do příslušné položky tabulky importem adresa. Tato tabulka ukládá 32bitové adresy trvalý; ukládat až 1024 importované funkce vyžaduje jej dirty pouze jednu stránku paměti.

Další informace

Stránky, které obsahují kód jsou sdíleny pomocí schématu ochranu kopírování na zápisu. Kopírování na zápisu znamená, že stránky je jen pro čtení; však Pokud proces zapíše narušení přístupu a stránky nedojde. Správce paměti místo toho provede soukromé kopie stránky pro použití aplikace a umožňuje zápis pokračovat. Pokud dva procesy spustit ze stejného souboru .exe, každý proces zpočátku má například všechny stránky mapovány z .exe soubor kopírování při zápisu. Jako dva procesy pokračovat upravovat stránky, obdrží každý z nich soukromé kopii změněné stránky. Správce paměti je zdarma optimalizovat neupravená stránek a mapovat stejné fyzické paměti adresní prostor oba procesy. Změněné stránky jsou si vymění místo do a ze souboru stránky namísto souboru .exe.

Dva typy opravy jsou k dispozici. První použita pro adresu importované funkce. Podle specifikace Portable program tento typ fixup uložena v import adresa tabulky (IAT), matici 32bitové funkce ukazatele, jeden pro každé importované funkci. IAT má vlastní stránky nebo stránek, protože vždy změněn. Volání importované funkce je ve skutečnosti nepřímé volání prostřednictvím příslušnou položku IAT. Při načtení obrázku na jeho upřednostňovaný základní adrese jsou importované funkce opravy pouze požadované opravy.

Poznámka optimalizaci je k dispozici, kde každé knihovně import exportuje 32bitové číslo, které odpovídá s každou funkce navíc k názvu nebo pořadové číslo. Toto slouží jako "rada" rychlost opravy prováděny zatížení čas. Pokud v aplikaci a načíst DLL rady neshodují, provádí zavaděč binární hledání založené na název funkce.

Typ fixup je vyžadován pro odkazy kód nebo data obrázku při obrázek je zaveden někde jiných než jeho upřednostňovaný základní adrese. Správce paměti odebere stránku z paměti, zkontroluje zobrazíte stránku byla změněna. Pokud není na stránce zachová mapování jeho kopii na zápis a zahozeny z paměti. Jinak ji musí být napsán souboru stránky tak upravené stránky lze obnovit ze souboru stránky, nikoli ze spustitelné bitové kopie souboru.

I když aplikace volá LoadLibrary() DLL více než jednou, DLL vstupní bod DllMain() nazývá pouze jednou a je vytvořena pouze jedna položka DLL_PROCESS_ATTACH. Podobně pokud aplikace zavolá FreeLibrary() více než jednou DLL_PROCESS_DETACH nastane pouze pro volání v které spočítat odkaz DLL vrátí nulu.

Data globální instance DLL je uložen na základě procesu (pouze jednu sadu dat za proces). Pokud je nutné ukládat data globální instance každé LoadLibrary() volání provedeno v jednom procesu, zvažte použití místní úložiště podprocesu (TLS) jako alternativu. Pokud používáte více podprocesů, provádění, TLS poskytuje úložiště dat jedinečný pro každou hodnotu ThreadID. Tento proces vyžaduje velmi málo režii DLL; globální TLS indexu ji musí vytvořit pouze při inicializaci procesu. Při inicializaci podproces použít GlobalAlloc(), HeapAlloc(), LocalAlloc() funkce v knihovně C Runtime nebo jinou metodu přidělení bloku paměti a volání funkce TlsSetValue() Uložit ukazatel do paměti pomocí globální TLS hodnotu indexu. Win32 interně ukládá ukazatel každý podproces indexována podle indexu TLS a ThreadID poskytovat specifické podproces úložiště.

Vlastnosti

ID článku: 100635 - Poslední aktualizace: 9. prosince 2005 - Revize: 5.0
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft Visual C++ 1.0 Professional Edition
  • Microsoft Visual C++ 2.0 Professional Edition
  • Microsoft Visual C++ 4.0 Standard Edition
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft Visual C++ .NET 2002 Standard Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
  • Microsoft Visual C++ 2005 Express Edition
Klíčová slova: 
kbmt kbdll kbhowto kbinfo kblangc KB100635 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:100635

Dejte nám zpětnou vazbu

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com