Momentálne ste offline a čaká sa, kým sa znova pripojíte na internet

PRB: Volanie LoadLibrary() načítať knižnicu DLL, ktorá má statické TLS

DÔLEŽITÉ: Tento článok bol preložený pomocou softvéru na strojový preklad od spoločnosti Microsoft, nie prekladateľom. Spoločnosť Microsoft ponúka články preložené prekladateľmi aj strojovo preložené články, vďaka čomu máte možnosť prístupu ku všetkým článkom databázy Knowledge Base vo svojom jazyku. Strojovo preložený článok však nie je vždy perfektný. Môže obsahovať chyby týkajúce sa slovnej zásoby, syntaxe alebo gramatiky, podobne ako cudzinec môže robiť chyby, keď rozpráva vašim jazykom. Spoločnosť Microsoft nenesie zodpovednosť za akékoľvek nepresnosti, chyby alebo škody spôsobené akýmkoľvek nepresným prekladom obsahu alebo jeho použitím zo strany zákazníkov. Spoločnosť Microsoft softvér na strojový preklad pravidelne aktualizuje.

Pokiaľ chcete vidieť anglickú verziu článku, kliknite sem:118816
PRIZNAKY
Dynamic-link library (DLL) používa __declspec(vlákno) prideliť lokálneho ukladania statických vlákno (TLS). Neexistujú žiadne problémy spojené s beží aplikácia, ktorá je prepojená s zodpovedajúce statické knižnice. Avšak, keď aplikácia používa Funkcia LoadLibrary Funkcia načítať knižnicu DLL namiesto pou┼╛itia statické verzia, Funkcia LoadLibrary prehrá v Win32s s kódom chyby 87: neplatný parameter.

Funkcia LoadLibrary uspeje na počítači so systémom Windows 98, Windows NT alebo Windows 2000 v tejto situácii. Správanie volanie funkcie v knižnici DLL, ktoré odkazujú na statické TLS premenných je však nedefinovaný. V systéme Microsoft Windows 95 Funkcia LoadLibrary zlyhá a GetLastError Funkcia vráti 1114 - ERROR_DLL_INIT_FAILED (dynamicky prepojovanej knižnice bežná Inicializácia zlyhala). V systéme Windows 2000 Funkcia LoadLibrary Funkcia uspeje. Avšak, akýkoľvek pokus o prístup k údajom TLS spôsobuje porušenie prístupu (AV).
PRICINA
Toto je obmedzenie Funkcia LoadLibrary a __declspec. Globálna premenná priestor pre vlákno je pridelené v čase spustenia. Veľkosť je založená na výpočet požiadaviek uplatňovanie plus požiadavky všetkých knižníc, ktoré sú staticky prepojené. Ak knižnica DLL používa statické TLS a je dynamický spojené v žiadosti, keď Funkcia LoadLibrary alebo FreeLibrary je názvom, systém musí nájsť všetky vlákna, ktoré existujú v procese a zväčšiť alebo kompaktné ich TLS pamäte podľa podľa veľkosti statické TLS v novo naložená knižnici DLL. Tento proces je príliš veľa pre operačné systémy na správu, ktoré môžu spôsobiť výnimku buď keď DLL je dynamicky sa nakladá alebo kódom odkazy údaje.
RIESENIE
DLL, ktoré používajú __declspec(vlákno) by nebolo možné načítať s Funkcia LoadLibrary.

DLL kódexu by sa mali upraviť používať také TLS funkcie ako TlsAlloc, a prideliť TLS, ak by mohli byť zaťažená DLL Funkcia LoadLibrary. Alebo DLL, ktorý používa __declspec(vlákno), by sa len implicitne naložené do aplikácie.
DALSIE INFORMACIE
Na určenie, či knižnica DLL používa statické TLS, Dumpbin.exe nástroj môže byť použitý k výpisu informácie v hlavičke. Knižnice DLL má statické TLS, ak hodnoty voliteľné Hlavička obsahuje veľkosť, ktorá je väčšia ako 0 (nula) v adresári skladovanie Thread takto:
517B20 [18] RVA [veľkosť] Thread skladovanie adresára
1.10 1.20 3.50

Upozornenie: Tento článok bol preložený automaticky.

Vlastnosti

ID článku: 118816 – Posledná kontrola: 10/10/2011 11:21:00 – Revízia: 2.0

Microsoft Win32 Application Programming Interface

  • kbdll kbkernbase kbprb kbthread kbmt KB118816 KbMtsk
Pripomienky