PRB: LoadLibrary() laden van een DLL-bestand dat statische TLS aanroepen

BELANGRIJK: Dit artikel is vertaald door de vertaalmachine software van Microsoft in plaats van door een professionele vertaler. Microsoft biedt u professioneel vertaalde artikelen en artikelen vertaald door de vertaalmachine, zodat u toegang heeft tot al onze knowledge base artikelen in uw eigen taal. Artikelen vertaald door de vertaalmachine zijn niet altijd perfect vertaald. Deze artikelen kunnen fouten bevatten in de vocabulaire, zinsopbouw en grammatica en kunnen lijken op hoe een anderstalige de taal spreekt en schrijft. Microsoft is niet verantwoordelijk voor onnauwkeurigheden, fouten en schade ontstaan door een incorrecte vertaling van de content of het gebruik ervan door onze klanten. Microsoft past continue de kwaliteit van de vertaalmachine software aan door deze te updaten.

De Engelstalige versie van dit artikel is de volgende: 118816
Symptomen
Een dynamic link library (DLL) gebruikt __declspec(thread) toewijzen statische thread lokale opslag (TLS). Er zijn geen problemen met een toepassing die is gekoppeld aan de corresponderende statische bibliotheek is gekoppeld. Echter, wanneer een toepassing de LoadLibrary -functie gebruikt aan het DLL-bestand in plaats van de statische versie, LoadLibrary mislukt op Win32s met een foutcode 87: ongeldige parameter.

LoadLibrary is uitgevoerd op een computer waarop Windows 98, Windows NT of Windows 2000 wordt uitgevoerd in deze situatie. Het gedrag van het aanroepen van functies in DLL die verwijzen naar statische variabelen met TLS is echter niet gedefinieerd. Functie van Microsoft Windows 95, LoadLibrary mislukt en de GetLastError retourneert 1114 - ERROR_DLL_INIT_FAILED (een dynamic link library initialisatieroutine is mislukt). In Windows 2000 slaagt de LoadLibrary -functie. Elke poging tot het TLS-gegevens wordt echter een toegangsfout (AV).
Oorzaak
Dit is een beperking van de LoadLibrary - en __declspec. De globale variabele ruimte voor een thread is toegewezen tijdens runtime. De grootte is gebaseerd op een berekening van de vereisten van de toepassing, plus de eisen van alle bibliotheken die statisch zijn gekoppeld. Als een DLL-bestand TLS statische gebruikt en dynamische gekoppeld in een toepassing wanneer LoadLibrary of FreeLibrary wordt aangeroepen, moet het systeem de threads die bestaan in het proces en vergroten of comprimeren van de TLS-geheugen aan de grootte van statische TLS in de zojuist geladen DLL vinden. Dit proces is te veel voor besturingssystemen beheren, waardoor een uitzondering als de DLL wordt dynamisch geladen of code verwijzingen naar de gegevens.
Oplossing
DLL's die gebruikmaken van __declspec(thread) moeten niet worden geladen met LoadLibrary.

De DLL-code moet worden gewijzigd om dergelijke functies TLS gebruiken als TlsAllocen TLS toewijzen als de DLL met LoadLibrarykan worden geladen. Of de DLL met __declspec(thread) mag alleen worden impliciet geladen in de toepassing.
Meer informatie
Om te bepalen of een DLL-bestand statisch TLS gebruikt, kan het hulpprogramma Dumpbin.exe dump de koptekstgegevens worden gebruikt. Een DLL-bestand heeft een statische TLS als de optionele waarden voor de kop bevat een formaat dat groter is dan 0 (nul) in de map opslag Thread als volgt:
517B20 [18] RVA [grootte] Thread opslag Directory
1.10 1,20 3,50

Waarschuwing: dit artikel is automatisch vertaald

Savybės

Straipsnio ID: 118816 – Paskutinė peržiūra: 07/10/2012 09:39:00 – Peržiūra: 6.0

Microsoft Win32-API

  • kbdll kbkernbase kbprb kbthread kbmt KB118816 KbMtnl
Atsiliepimai