En dynamisk länk bibliotek eller DLL , gör ett program för att ladda bara den nödvändiga koden minsta körbar i minnet vid körning . Närhelst programmet anropar en funktion i en DLL , laddar operativsystemet DLL i minnet i enlighet med programmerarens specifikationer . Så länge kör programmet refererar inte en DLL-funktion , som DLL behöver inte upptar utrymme . Detta sparar mycket resurser och ökar run - time prestanda . Om biblioteket var statiska , skulle alla bibliotekets kod fogas till huvudprogrammet körbara kod , och den gigantiska programmet skulle behöva stanna i minnet för hela drifttid . Unix eller Linux-version av en Windows DLL är ett delat bibliotek , byggd i enlighet med filändelsen " . Så . " Windows , Unix och Linux har särskilda konventioner för att komma åt funktioner i DLL-filer eller delade bibliotek . Exportera Windows DLL objekt med dllexport Keyword
att göra en funktion , klass , dataelement eller gruppmedlem funktion tillgänglig för anropande Windows -program , måste du exportera den först . En klass eller funktion får exporteras under sin definition med nyckelordet " __declspec ( dllexport ) " innan funktionen , klass eller variabelnamn , enligt följande :
Void __ declspec ( dllexport ) MyClass : offentlig CObjectName { ..... }
i DLL header -filen , lägger detta sökord innan funktionen namnet på en prototyp deklaration . Sökordet " __declspec ( dllexport ) " lagrar namn på funktioner i DLL Exportera tabell . För att hushålla med utrymmet att denna tabell upptar , använder ordningstal istället för namn på funktioner .
Exportera Windows DLL Objekt igenom filer moduldefinition
Som ett alternativ till sökordet " __declspec ( dllexport ) , " skapa en fil modul definition som anger bibliotekets namn , valfri beskrivning och listar namnen på funktioner, klasser och datavariabler i DLL tillsammans med valfria ordningstal värden . Ordningstalet för en funktion sträcker sig från 1 till N där N är antalet funktioner i DLL. Modulen definition filen har tillägget Nedan följer ett exempel på en modul definition fil , eller en DEF -fil " DEF . . " : .
LIBRARY ReportWriterDESCRIPTION Denna dynamiska biblioteket innehåller funktionalitet rapportgenerator för MyProduct.RPT_setup @ 1RPT_design @ 2RPT_run @ 3RPT_print @ 4
p Om du skapar en Microsoft Foundation Class DLL hjälp av Visual Studio AppWizard kommer guiden att generera ett skelett . DEF fil för DLL och lägga till den i projektet . Lägg till poster för DLL funktioner i detta . DEF fil att exportera dem . Formatet på funktionsprototyp används av den anropande programmet måste matcha formatet av funktionen poster i . DEF filen . Antingen använda enkla definitioner på båda ställena , eller kompilator - specifika , kompilator - genererade definitioner på båda ställena konsekvent.
Import och export Extension DLL
Microsoft Foundation Class förlängning DLL består typiskt av återanvändbara klasser härledda från befintliga MFC klasstyper . De är byggda med en DLL version av MFC , och kan anropas från program och DLL byggts med denna delade versionen av MFC . Att exportera klasser i förlängning DLL , använd makrot " AFX_EXT_CLASS " innan klassnamnet så här : Klass AFX_EXT_CLASS CMyViewClass : offentliga CView { //Klass kropp } , Om du använder en DEF -fil , lägg till följande makrokoden i början . och utgången av den förlängda DLL header -fil : # undef AFX_DATA # define AFX_DATA AFX_EXT_DATA //
# undef AFX_DATA # define AFX_DATA
Dessa förprocessorn direktiv se till att MFC variablerna och härledningar och exporterats från den utvidgade DLL . Addera importera DLL funktioner
den andra sidan av exporterande objekt från DLL-filer är att importera dem till program som använder " __declspec ( DllImport ) " sökord.
exportera C- funktioner som kan användas i C eller C + + körbara
p Om det anropande programmet eller funktionen är skrivet i C + + , använder " extern C " förprocessor direktiv i DLL Header om DLL-funktioner är skrivna i C.
Här är ett exempel ://MyDLLFunctions.h # ifdef __ cplusplusExtern "C" { # endif__declspec ( DllImport ) void MyFunc01 (); __declspec ( DllImport ) void MyFunc02 ( ) ; # ifdef __ cplusplus } //slut parentes för " extern C " direktiv # endif
som ett alternativ till att ange " Extern C " direktiv inom DLL header , kan du inkludera filen DLL header med en "Extern" C " " wrapper villkorligt , enligt följande:
# ifdef __ cplusplusExtern "C" { # endif
# include " DLLPATH \\ MyDLLFunctions.h "
# ifdef __ cplusplus } //slut parentes för " extern C " direktiv # endif