Delen via


C/C++-DLL's maken in Visual Studio

In Windows is een DLL (Dynamic Link Library) een soort uitvoerbaar bestand dat fungeert als een gedeelde bibliotheek met functies en resources. Dynamisch koppelen is een besturingssysteemmogelijkheid. Hiermee kan een uitvoerbaar bestand functies aanroepen of resources gebruiken die zijn opgeslagen in een afzonderlijk bestand. Deze functies en resources kunnen afzonderlijk van de uitvoerbare bestanden worden gecompileerd en geïmplementeerd.

Een DLL is geen zelfstandig uitvoerbaar bestand. DLL's worden uitgevoerd in de context van de toepassingen die ze aanroepen. Het besturingssysteem laadt het DLL-bestand in de geheugenruimte van een toepassing. Dit gebeurt wanneer de toepassing wordt geladen (impliciete koppeling) of op aanvraag tijdens runtime (expliciete koppeling). Met DLL's kunt u ook eenvoudig functies en resources delen tussen uitvoerbare bestanden. Meerdere toepassingen hebben tegelijkertijd toegang tot de inhoud van één kopie van een DLL in het geheugen.

Verschillen tussen dynamische koppelingen en statische koppelingen

Met statische koppeling worden alle objectcode in een statische bibliotheek gekopieerd naar de uitvoerbare bestanden die deze gebruiken wanneer ze worden gebouwd. Dynamische koppeling bevat alleen de informatie die Windows tijdens runtime nodig heeft om het DLL-bestand met een gegevensitem of functie te zoeken en te laden. Wanneer u een DLL maakt, maakt u ook een importbibliotheek die deze informatie bevat. Wanneer u een uitvoerbaar bestand maakt dat de DLL aanroept, gebruikt de linker de geëxporteerde symbolen in de importbibliotheek om deze informatie op te slaan voor het Windows-laadprogramma. Wanneer het laadprogramma een DLL laadt, wordt het DLL-bestand toegewezen aan de geheugenruimte van uw toepassing. Als deze aanwezig is, wordt een speciale functie in het DLL-bestand aangeroepen DllMainom een initialisatie uit te voeren die nodig is voor het DLL-bestand.

Verschillen tussen toepassingen en DLL's

Hoewel DLL's en toepassingen beide uitvoerbare modules zijn, verschillen ze op verschillende manieren. Het meest voor de hand liggende verschil is dat u geen DLL kunt uitvoeren. Vanuit het oogpunt van het systeem zijn er twee fundamentele verschillen tussen toepassingen en DLL's:

  • Een toepassing kan meerdere exemplaren van zichzelf tegelijk in het systeem uitvoeren. Een DLL kan slechts één exemplaar hebben.

  • Een toepassing kan als proces worden geladen. Het kan eigenaar zijn van zaken zoals een stack, threads van uitvoering, globaal geheugen, bestandsingangen en een berichtenwachtrij. Een DLL kan geen eigenaar zijn van deze dingen.

Voordelen van het gebruik van DLL's

Dynamische koppelingen naar code en resources bieden verschillende voordelen ten opzichte van statische koppelingen:

  • Dynamische koppeling bespaart geheugen en vermindert het wisselen. Veel processen kunnen tegelijkertijd een DLL gebruiken, waarbij één kopie van de alleen-lezen onderdelen van een DLL in het geheugen wordt gedeeld. Elke toepassing die is gebouwd met behulp van een statisch gekoppelde bibliotheek, heeft daarentegen een volledige kopie van de bibliotheekcode die Windows in het geheugen moet laden.

  • Dynamische koppeling bespaart schijfruimte en bandbreedte. Veel toepassingen kunnen één kopie van het DLL-bestand op schijf delen. Elke toepassing die is gebouwd met behulp van een statische koppelingsbibliotheek, heeft daarentegen de bibliotheekcode gekoppeld aan de uitvoerbare installatiekopie. Dat maakt gebruik van meer schijfruimte en neemt meer bandbreedte over om over te dragen.

  • Onderhoud, beveiligingsoplossingen en upgrades kunnen eenvoudiger zijn. Wanneer uw toepassingen algemene functies in een DLL gebruiken, kunt u oplossingen voor fouten implementeren en updates implementeren in het DLL-bestand. Wanneer DLL's worden bijgewerkt, hoeven de toepassingen die ze gebruiken, niet opnieuw te worden gecompileerd of opnieuw gekoppeld. Ze kunnen gebruikmaken van de nieuwe DLL zodra deze is geïmplementeerd. Als u daarentegen oplossingen aanbrengt in statisch gekoppelde objectcode, moet u elke toepassing die deze gebruikt, opnieuw koppelen en implementeren.

  • U kunt DLL's gebruiken om ondersteuning na de markt te bieden. Een DLL van het beeldschermstuurprogramma kan bijvoorbeeld worden gewijzigd ter ondersteuning van een weergave die niet beschikbaar was toen de toepassing werd verzonden.

  • U kunt expliciete koppelingen gebruiken om DLL's tijdens runtime te detecteren en te laden. Toepassingsextensies die bijvoorbeeld nieuwe functionaliteit aan uw app toevoegen zonder deze opnieuw te bouwen of opnieuw te implementeren.

  • Dynamische koppeling maakt het eenvoudiger om toepassingen te ondersteunen die zijn geschreven in verschillende programmeertalen. Programma's die in verschillende programmeertalen zijn geschreven, kunnen dezelfde DLL-functie aanroepen zolang de programma's de aanroepconventie van de functie volgen. De programma's en de DLL-functie moeten op de volgende manieren compatibel zijn: de volgorde waarin de functie verwacht dat de argumenten naar de stack worden gepusht. Of de functie of de toepassing verantwoordelijk is voor het opschonen van de stapel. En of er argumenten worden doorgegeven in registers.

  • Dynamische koppeling biedt een mechanisme om de MFC-klassen (Microsoft Foundation Class Library) uit te breiden. U kunt klassen afleiden uit de bestaande MFC-klassen en deze in een MFC-extensie-DLL plaatsen voor gebruik door MFC-toepassingen.

  • Dynamische koppeling maakt het maken van internationale versies van uw toepassing eenvoudiger. DLL's zijn een handige manier om landinstellingenspecifieke resources te leveren, waardoor het veel eenvoudiger is om internationale versies van een toepassing te maken. In plaats van veel gelokaliseerde versies van uw toepassing te verzenden, kunt u de tekenreeksen en afbeeldingen voor elke taal in een afzonderlijke bron-DLL plaatsen. Vervolgens kan uw toepassing tijdens runtime de juiste resources voor die landinstelling laden.

Een potentieel nadeel van het gebruik van DLL's is dat de toepassing niet zelfstandig is. Het hangt af van het bestaan van een afzonderlijke DLL-module: een module die u moet implementeren of verifiëren als onderdeel van uw installatie.

Meer informatie over het maken en gebruiken van DLL's

De volgende artikelen bevatten gedetailleerde informatie over het maken van C/C++-DLL's in Visual Studio.

Overzicht: Een dynamische koppelingsbibliotheek maken en gebruiken (C++)
Hierin wordt beschreven hoe u een DLL maakt en gebruikt met Visual Studio.

Soorten DLLs
Bevat informatie over de verschillende soorten DLL's die kunnen worden gebouwd.

Veelgestelde vragen over DLL
Biedt antwoorden op veelgestelde vragen over DLL's.

Een uitvoerbaar bestand koppelen aan een DLL
Beschrijft expliciete en impliciete koppelingen naar een DLL.

Een DLL initialiseren
Hiermee wordt de DLL-initialisatiecode besproken die moet worden uitgevoerd wanneer uw DLL wordt geladen.

DLL's en gedrag van runtime-bibliotheken van Microsoft C++
Beschrijft de opstartvolgorde van de runtimebibliotheek-DLL.

LoadLibrary en AfxLoadLibrary
Bij runtime wordt besproken hoe LoadLibrary en AfxLoadLibrary expliciet aan een DLL worden gekoppeld.

GetProcAddress-
Hiermee wordt het gebruik GetProcAddress besproken om het adres van een geëxporteerde functie in het DLL-bestand te verkrijgen.

FreeLibrary en AfxFreeLibrary
Hiermee wordt het gebruik FreeLibrary besproken en AfxFreeLibrary wanneer de DLL-module niet meer nodig is.

Dynamic-Link bibliotheekzoekvolgorde
Beschrijft het zoekpad dat het Windows-besturingssysteem gebruikt om een DLL op het systeem te zoeken.

Modulestatussen van een reguliere MFC DLL dynamisch gekoppeld aan MFC
Beschrijft de modulestatussen van een reguliere MFC DLL die dynamisch is gekoppeld aan MFC.

MFC-extensie-DLL's
Legt DLL's uit die doorgaans herbruikbare klassen implementeren die zijn afgeleid van de bestaande MFC-klassen.

Een DLL met alleen resources maken
Hiermee wordt een DLL met alleen resources besproken, die niets anders bevat dan resources, zoals pictogrammen, bitmaps, tekenreeksen en dialoogvensters.

Gelokaliseerde resources in MFC-toepassingen: Satelliet-DLL's
Biedt verbeterde ondersteuning voor satelliet-DLL's, een functie die helpt bij het maken van toepassingen die zijn gelokaliseerd voor meerdere talen.

Importeren en exporteren
Beschrijft het importeren van openbare symbolen in een toepassing of het exporteren van functies uit een DLL

Actieve technologie en DLL's
Hiermee kunnen objectservers worden geïmplementeerd in een DLL.

Automatisering in een DLL
Hierin wordt beschreven wat de optie Automation in de wizard MFC DLL levert.

Naamconventies voor MFC-DLL's
Hierin wordt beschreven hoe de DLL's en bibliotheken in MFC een gestructureerde naamconventie volgen.

DLL-functies aanroepen vanuit Visual Basic-toepassingen
Beschrijft hoe u DLL-functies aanroept vanuit Visual Basic-toepassingen.

MFC gebruiken als onderdeel van een DLL
Beschrijft reguliere MFC-DLL's, waarmee u de MFC-bibliotheek kunt gebruiken als onderdeel van een Windows dynamic-link-bibliotheek.

DLL-versie van MFC
Beschrijft hoe u de MFCxx.dll en MFCxxD.dll (waarbij x het MFC-versienummer is) gedeelde bibliotheken voor dynamische koppeling kunt gebruiken met MFC-toepassingen en MFC-extensie-DLL's.