Dela via


Skapa DLL:er för C/C++ i Visual Studio

I Windows är ett DLL-bibliotek (Dynamic Link Library) en typ av körbar fil som fungerar som ett delat bibliotek med funktioner och resurser. Dynamisk länkning är en operativsystemfunktion. Det gör att en körbar fil kan anropa funktioner eller använda resurser som lagras i en separat fil. Dessa funktioner och resurser kan kompileras och distribueras separat från de körbara filer som använder dem.

En DLL är inte en fristående körbar fil. DLL:er körs i kontexten för de program som anropar dem. Operativsystemet läser in DLL:en i ett programs minnesutrymme. Det görs antingen när programmet läses in (implicit länkning) eller på begäran vid körning (explicit länkning). DLL:er gör det också enkelt att dela funktioner och resurser mellan körbara filer. Flera program kan komma åt innehållet i en enda kopia av en DLL i minnet samtidigt.

Skillnader mellan dynamisk länkning och statisk länkning

Statisk länkning kopierar all objektkod i ett statiskt bibliotek till de körbara filer som använder den när de skapas. Dynamisk länkning innehåller endast den information som krävs av Windows vid körning för att hitta och läsa in den DLL som innehåller ett dataobjekt eller en funktion. När du skapar en DLL skapar du också ett importbibliotek som innehåller den här informationen. När du skapar en körbar fil som anropar DLL, använder länkaren de exporterade symbolerna i importbiblioteket för att lagra denna information för Windows-laddaren. När inläsaren läser in en DLL mappas DLL:n till programmets minnesutrymme. Om den finns anropas en särskild funktion i DLL:en för att utföra den initiering som DLL:en kräver.

Skillnader mellan program och DLL:er

Även om DLL:er och program båda är körbara moduler skiljer de sig åt på flera sätt. Den mest uppenbara skillnaden är att du inte kan köra en DLL. Ur systemets synvinkel finns det två grundläggande skillnader mellan program och DLL:er:

  • Ett program kan ha flera instanser av sig själv som körs i systemet samtidigt. En DLL kan bara ha en instans.

  • En applikation kan läsas in som en process. Den kan äga saker som en stack, trådar för exekvering, globalt minne, filhandtag och en meddelandekö. En DLL kan inte äga dessa saker.

Fördelar med att använda DLL:er

Dynamisk länkning till kod och resurser har flera fördelar jämfört med statisk länkning:

  • Dynamisk länkning sparar minne och minskar växlingen. Många processer kan använda en DLL samtidigt och dela en enda kopia av de skrivskyddade delarna av en DLL i minnet. Däremot har varje program som skapas med hjälp av ett statiskt länkat bibliotek en fullständig kopia av bibliotekskoden som Windows måste läsa in i minnet.

  • Dynamisk länkning sparar diskutrymme och bandbredd. Många program kan dela en enda kopia av DLL:en på disken. Däremot har varje program som skapats med hjälp av ett statiskt länkbibliotek bibliotekskoden länkad till den körbara avbildningen. Det använder mer diskutrymme och tar mer bandbredd för att överföra.

  • Underhåll, säkerhetskorrigeringar och uppgraderingar kan vara enklare. När dina program använder vanliga funktioner i en DLL kan du implementera felkorrigeringar och distribuera uppdateringar till DLL:en. När DLL:er uppdateras behöver de program som använder dem inte omkompileras eller länkas om. De kan använda den nya DLL-filen så snart den har distribuerats. När du däremot gör korrigeringar i statiskt länkad objektkod måste du länka om och distribuera om alla program som använder den.

  • Du kan använda DLL:er för att tillhandahålla eftermarknadssupport. En DLL för visningsdrivrutinen kan till exempel ändras för att stödja en visning som inte var tillgänglig när programmet levererades.

  • Du kan använda explicit länkning för att upptäcka och läsa in DLL:er under körning. Till exempel programtillägg som lägger till nya funktioner i din app utan att återskapa eller distribuera om den.

  • Dynamisk länkning gör det enklare att stödja program som skrivits på olika programmeringsspråk. Program som skrivits på olika programmeringsspråk kan anropa samma DLL-funktion så länge programmen följer funktionens anropskonvention. Programmen och DLL-funktionen måste vara kompatibla på följande sätt: I den ordning funktionen förväntar sig att dess argument ska push-överföras till stacken. Om funktionen eller programmet ansvarar för att rensa stacken. Om något argument överförs i register.

  • Dynamisk länkning ger en mekanism för att utöka MFC-klassklasserna (Microsoft Foundation Class Library). Du kan härleda klasser från de befintliga MFC-klasserna och placera dem i ett MFC-tilläggs-DLL för användning av MFC-program.

  • Dynamisk länkning gör det enklare att skapa internationella versioner av ditt program. DLL:er är ett bekvämt sätt att tillhandahålla språkspecifika resurser, vilket gör det mycket enklare att skapa internationella versioner av ett program. I stället för att skicka många lokaliserade versioner av ditt program kan du placera strängar och bilder för varje språk i en separat resurs-DLL. Sedan kan din applikation läsa in lämpade resurser för den lokaliseringen vid körning.

En potentiell nackdel med att använda DLL:er är att programmet inte är fristående. Det beror på förekomsten av en separat DLL-modul: en som du måste distribuera eller verifiera själv som en del av installationen.

Mer information om hur du skapar och använder DLL:er

Följande artiklar innehåller detaljerad information om hur du skapar DLL:er för C/C++ i Visual Studio.

Genomgång: Skapa och använda ett dynamiskt länkbibliotek (C++)
Beskriver hur du skapar och använder en DLL med Visual Studio.

Typer av DLL:er
Innehåller information om de olika typer av DLL:er som kan skapas.

Vanliga frågor och svar om DLL
Ger svar på vanliga frågor om DLL:er.

Länka en körbar fil till en DLL
Beskriver explicit och implicit länkning till en DLL.

Initiera en DLL
Diskuterar DLL-initieringskod som måste köras när DLL-filen läses in.

DLL-filer och Visual C++-körningsbiblioteksbeteende
Beskriver körningsbibliotekets DLL-startsekvens.

LoadLibrary och AfxLoadLibrary
Diskuterar att använda LoadLibrary och AfxLoadLibrary för att uttryckligen länka till en DLL vid körning.

GetProcAddress
Diskuterar användningen av GetProcAddress för att hämta adressen till en exporterad funktion i DLL:en.

FreeLibrary och AfxFreeLibrary
Diskuterar hur du använder FreeLibrary och AfxFreeLibrary när DLL-modulen inte längre behövs.

Dynamic-Link sökordning för bibliotek
Beskriver sökvägen som Windows-operativsystemet använder för att hitta en DLL i systemet.

Modultillstånd för en vanlig MFC DLL dynamiskt länkad till MFC
Beskriver modultillstånden för en vanlig MFC DLL dynamiskt länkad till MFC.

MFC-tilläggs-DLL:er
Förklarar DLL:er som vanligtvis implementerar återanvändbara klasser som härleds från de befintliga MFC-klasserna.

Skapa en DLL för endast resurs
Diskuterar en DLL för endast resurser, som bara innehåller resurser, till exempel ikoner, bitmappar, strängar och dialogrutor.

Lokaliserade resurser i MFC-program: Satellit-DLL:er
Ger förbättrat stöd för satellit-DLL:er, en funktion som hjälper dig att skapa program lokaliserade för flera språk.

Importera och exportera
Beskriver hur du importerar offentliga symboler till ett program eller exporterar funktioner från en DLL

Aktiv teknik och DLL:er
Tillåter att objektservrar implementeras i en DLL.

Automatisering i en DLL
Beskriver vad alternativet Automation i MFC DLL-guiden tillhandahåller.

Namngivningskonventioner för MFC-DLL:er
Beskriver hur DLL:er och bibliotek som ingår i MFC följer en strukturerad namngivningskonvention.

Anropa DLL-funktioner från Visual Basic-program
Beskriver hur du anropar DLL-funktioner från Visual Basic-program.

Använda MFC som en del av en DLL
Beskriver vanliga MFC-DLL:er, som gör att du kan använda MFC-biblioteket som en del av ett Windows-dynamiskt länkbibliotek.

DLL-version av MFC
Beskriver hur du kan använda MFCxx.dll och MFCxxD.dll (där x är MFC-versionsnumret) delade dynamiska länkbibliotek med MFC-program och DLL:er för MFC-tillägg.