Dynamic-Link biblioteksdata
Ett Dynamic-Link-bibliotek (DLL) kan innehålla globala data eller lokala data.
Variabelomfång
Variabler som deklareras som globala i en DLL-källkodsfil behandlas som globala variabler av kompilatorn och länkaren, men varje process som läser in en viss DLL får en egen kopia av DLL:ets globala variabler. Omfånget för statiska variabler är begränsat till blocket där de statiska variablerna deklareras. Därför har varje process sin egen instans av de globala och statiska DLL-variablerna som standard.
Not
Med dina utvecklingsverktyg kan du åsidosätta standardbeteendet. Kompilatorn Visual C++ stöder till exempel #pragma avsnittet och länkaren stöder alternativet /SECTION. Mer information finns i dokumentationen som ingår i dina utvecklingsverktyg.
Dynamisk minnesallokering
När en DLL allokerar minne med någon av funktionerna för minnesallokering (GlobalAlloc, LocalAlloc, HeapAllococh VirtualAlloc) allokeras minnet i det virtuella adressutrymmet för anropsprocessen och är endast tillgängligt för trådarna i den processen.
En DLL kan använda filmappning för att allokera minne som kan delas mellan processer. En allmän diskussion om hur du använder filmappning för att skapa namngivet delat minne finns i Filmappning. Ett exempel som använder funktionen DllMain för att konfigurera delat minne med hjälp av filmappning finns i Using Shared Memory in a Dynamic-Link Library.
Lokal trådlagring
Funktionerna för lokal trådlagring (TLS) gör det möjligt för en DLL att allokera ett index för att lagra och hämta ett annat värde för varje tråd i en flertrådad process. Ett kalkylbladsprogram kan till exempel skapa en ny instans av samma tråd varje gång användaren öppnar ett nytt kalkylblad. En DLL som tillhandahåller funktionerna för olika kalkylbladsåtgärder kan använda TLS för att spara information om det aktuella tillståndet för varje kalkylblad (rad, kolumn och så vidare). En allmän diskussion om lokal trådlagring finns i Lokal lagringstråd. Ett exempel som använder funktionen DllMain för att konfigurera lokal trådlagring finns i Using Thread Local Storage in a Dynamic-Link Library.
Windows Server 2003 och Windows XP: Visual C++-kompilatorn stöder en syntax som gör att du kan deklarera trådlokala variabler: _declspec(tråd). Om du använder den här syntaxen i en DLL kan du inte läsa in DLL:n explicit med hjälp av LoadLibrary eller LoadLibraryEx på versioner av Windows före Windows Vista. Om DLL:en läses in explicit måste du använda de lokala lagringsfunktionerna för tråden i stället för _declspec(tråd).