PRB: Volání LoadLibrary() načíst DLL, která má statická TLS

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

Příznaky

Dynamická knihovna (DLL) používá __declspec (podproces) přidělit místní úložiště podprocesu statické (TLS). Neexistují žádné problémy spojené s spuštěním aplikace, která je propojena s odpovídající statické knihovny. Však při aplikace používá funkci Funkce LoadLibrary načíst DLL namísto použití statické verze, Funkce LoadLibrary nezdaří na Win32s s kódem chyby 87: Neplatný parametr.

Funkce LoadLibrary úspěšně v počítači se systémem Windows 98, Windows NT nebo Windows 2000 v této situaci. Je však Nedefinovaný chování volání funkce v DLL odkazovat na proměnné statické TLS. V systému Microsoft Windows 95 Funkce LoadLibrary selže a GetLastError fungovat vrátí 1114 - ERROR_DLL_INIT_FAILED (dynamické propojení knihovny Inicializační rutina se nezdařilo). Funkce LoadLibrary funkce v systému Windows 2000 úspěšné. Jakýkoli pokus o přístup k datům TLS však způsobí narušení přístupu (AV).

Příčina

Jedná se o omezení Funkce LoadLibrary a __declspec. Globální proměnné místa podproces přiděleny v době spuštění. Velikost je založena na výpočtu požadavky aplikace plus požadavky všech knihoven, které jsou staticky propojeny. Pokud DLL používá TLS statické a dynamické propojena v aplikaci, při volání Funkce LoadLibrary nebo FreeLibrary, musí systém podprocesů, které existují v procesu a zvětšit nebo komprimovat jejich TLS paměti podle velikosti statické TLS v nově načíst DLL najít. Tento proces je příliš velká pro operační systémy chcete spravovat, což může způsobit výjimku buď je dynamicky načten DLL nebo kód odkazy data.

Řešení

__Declspec (podproces) použít dll nelze načíst pomocí Funkce LoadLibrary.

Kód DLL by změněna použít například funkce TLS jako TlsAlloc a přidělit Pokud DLL může být načten s Funkce LoadLibrary TLS. Nebo DLL pomocí __declspec (podproces) by měl být implicitně načíst pouze do aplikace.

Další informace

Chcete-li zjistit, zda používá DLL statické TLS, lze nástroj Dumpbin.exe vypsat informace záhlaví. DLL má statické TLS, pokud obsahuje volitelné hodnoty HEADER velikost je větší než 0 (nula) v adresáři úložiště vlákno následujícím způsobem:
[18] RVA 517B20 [velikost] podprocesů úložiště adresáře

Vlastnosti

ID článku: 118816 - Poslední aktualizace: 21. listopadu 2006 - Revize: 3.2
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft Win32 Application Programming Interface na těchto platformách
    • Microsoft Windows 95
    • Microsoft Windows 98 Standard Edition
    • the operating system: Microsoft Windows 2000
    • Microsoft Windows Millennium Edition
    • Microsoft Windows NT 4.0
    • the operating system: Microsoft Windows XP
Klíčová slova: 
kbmt kbdll kbkernbase kbprb kbthread KB118816 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:118816

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