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

Vertaalde artikelen Vertaalde artikelen
Artikel ID: 118816 - Bekijk de producten waarop dit artikel van toepassing is.
Alles uitklappen | Alles samenvouwen

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

Eigenschappen

Artikel ID: 118816 - Laatste beoordeling: dinsdag 10 juli 2012 - Wijziging: 6.0
De informatie in dit artikel is van toepassing op:
  • Microsoft Win32-API op de volgende platformen
    • Microsoft Windows 98 Standard Edition
    • Microsoft Windows Millennium Edition
Trefwoorden: 
kbdll kbkernbase kbprb kbthread kbmt KB118816 KbMtnl
Automatisch vertaald artikel
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

Geef ons feedback

 

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