En Dynamic Link Library eller DLL , gjør et program for å laste bare det nødvendige minimum kjørbar kode i minnet under kjøring. Når programmet kaller en funksjon i en DLL, laster operativsystemet DLL-filen i minnet i tråd med programmerer spesifikasjoner. Så lenge du kjører programmet ikke refererer en DLL- funksjon, som DLL trenger ikke opptar plass . Dette sparer mye ressurs og øker run- time ytelse . Hvis biblioteket var statiske , ville alle av biblioteket koden bli lagt til hovedprogrammet er kjørbar kode og den gigantiske program ville ha å bo i minnet for hele kjøretid . Unix eller Linux-versjon av en Windows DLL er et delt bibliotek , bygget tilsvarende med utvidelsen " . Så . " Windows , Unix og Linux har spesifikke konvensjoner for å få tilgang til funksjoner i DLL-filer eller delte biblioteker. Eksport Windows DLL objekter ved hjelp dllexport Søkeord
å lage en funksjon , klasse, data element eller klasse medlem funksjon tilgjengelig for å kalle Windows -program , må du eksportere den først. En klasse eller funksjon kan bli eksportert i løpet av sin definisjon bruke søkeordet " __declspec ( dllexport ) " før funksjon, klasse eller variabel navn , som følger : en
Void __ declspec ( dllexport ) MyClass : public CObjectName { ..... }
I DLL header -fil, legger dette søkeordet før funksjonen navnet på en prototype erklæring. Søkeordet " __declspec ( dllexport )" lagrer funksjon navnene i DLL eksport tabellen . Å økonomisere plass at denne tabellen okkuperer, bruke ordenstall i stedet for funksjon navn .
Export Windows DLL Objects Gjennom moduldefinisjon filer
p Som et alternativ til søkeordet " __declspec ( dllexport ) , "skape en moduldefinisjonen fil som sier biblioteket navn, valgfri beskrivelse og lister navnene på funksjoner, klasser og data variabler i DLL sammen med valgfrie ordinale verdier. Den Ordenstallet av en funksjon går fra 1 til N der N er antallet av funksjoner i DLL. Den moduldefinisjonen har filtypen Følgende er et eksempel på en modul definisjon fil , eller en DEF fil " DEF . ". : .
BIBLIOTEK ReportWriterDESCRIPTION Denne dynamiske biblioteket inneholder rapporten generator funksjonalitet MyProduct.RPT_setup @ 1RPT_design @ 2RPT_run @ 3RPT_print @ 4
p Hvis du oppretter en Microsoft Foundation Class DLL med Visual Studio AppWizard , vil veiviseren generere et skjelett . DEF -filen for DLL og legge den til i prosjektet. Legge til oppføringer for DLL-funksjoner i dette. DEF fil for å eksportere dem . Formatet på funksjon prototype brukes av kalle programmet må samsvare med formatet funksjon oppføringer i . DEF -filen. Enten bruke enkle definisjoner på begge steder , eller kompilator -spesifikke, kompilator - generert definisjonene i begge steder konsekvent .
Import og eksport Extension DLL
Microsoft Foundation Class forlengelse DLL består vanligvis av gjenbrukbare klasser utledet fra eksisterende MFC- klassen typer. De er bygget ved hjelp av en DLL versjon av MFC , og kan kalles fra programmer og DLLs bygget med denne felles versjon av MFC . Å eksportere klasser i forlengelse DLL-filer , bruker makro " AFX_EXT_CLASS " før klassen navnet slik: Klasse AFX_EXT_CLASS CMyViewClass : public CView { //Klasse body} ; Hvis du bruker en DEF fil , legge til følgende makro kode i begynnelsen. og slutten av den utvidede DLL header filen: # undef AFX_DATA # define AFX_DATA AFX_EXT_DATA //
# undef AFX_DATA # define AFX_DATA
Disse preprosessor direktiver sørge for at MFC variabler og avledninger og eksportert fra den utvidede DLL .
importerer DLL -funksjoner
den andre siden av eksport av gjenstander fra DLL-filer er å importere dem inn i programmer som bruker " __declspec ( DllImport ) "søkeord .
Export C-funksjoner til bruk i C eller C + + kjørbare
p Hvis det ringer program eller funksjon er skrevet i C + + , bruke" extern C " preprocessor direktiv i DLL header dersom DLL-funksjoner er skrevet i C.
Her er et eksempel ://MyDLLFunctions.h # ifdef __ cplusplusExtern "C" {# endif__declspec ( DllImport ) void MyFunc01 (); __declspec ( DllImport ) void MyFunc02 (); # ifdef __ cplusplus } //end braketter for "ekstern C" direktiv # endif
p Som et alternativ til å spesifisere " ekstern C" direktiv innenfor DLL header , kan du inkludere DLL header -fil med en " Ekstern " C " " wrapper betinget, som følger : en
# ifdef __ cplusplusExtern "C " { # endif
# include " DLLPATH \\ MyDLLFunctions.h "
# ifdef __ cplusplus } //end braketter for "ekstern C" direktiv # endif