Dynamiske Calling funksjoner i DLL-filer

Dynamiske Calling funksjoner i DLL-filer


En biblioteket for dynamiske koblinger, eller DLL gjør et program for å laste kun 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 samsvar med programmererens spesifikasjoner. Så lenge kjører programmet ikke referere til en DLL-funksjonen, trenger at DLL ikke opptar plass. Dette sparer mye ressurser og øker run-time ytelse. Hvis biblioteket var statiske, ville alle av biblioteket kode legges til hovedprogrammet er kjørbar kode og den gigantiske programmet ville ha å bo i minnet for hele kjøretid. Unix eller Linux-versjon av en Windows DLL er et delt bibliotek, bygget i samsvar med utvidelsen ".so." Windows, Unix og Linux har spesifikke konvensjoner for å få tilgang til funksjoner i DLL-filer eller delte biblioteker.

Export Windows DLL objekter ved hjelp dllexport Søkeord

For å gjøre en funksjon, klasse, dataelement eller klasse medlem funksjonen tilgjengelig for å kalle Windows-program, må du eksportere det først. En klasse eller funksjon kan eksporteres under definisjonen med søkeordet "__declspec (dllexport)" før funksjon, klasse eller variabel navn, som følger:

Void __declspec (dllexport) MyClass: public CObjectName {... ..}

I DLL header filen, sette dette søkeordet før funksjonsnavnet i en prototype erklæring. Nøkkelordet "__declspec (dllexport)" lagrer funksjonsnavnene i DLL eksport bord. For å spare plass at denne tabellen opptar, bruke ordenstall i stedet for funksjonsnavn.

Export Windows DLL-objekter gjennom Module definisjonsfiler

Som et alternativ til søkeordet "__declspec (dllexport)," skape en modul definisjon fil som sier biblioteknavnet, eventuelt en beskrivelse og viser navnene på funksjoner, klasser og data variabler i DLL sammen med valgfrie ordens verdier. Ordinal verdien av en funksjon varierer fra 1 til N, hvor N er antall av funksjoner i DLL. Modulen definisjon har filtypen "def." Følgende er et eksempel på en modul definisjon fil, eller en def fil:

LIBRARY Report
BESKRIVELSE Denne dynamiske bibliotek inneholder rapporten generator funksjonalitet MyProduct.
RPT_setup @ 1
RPT_design @ 2
RPT_run @ 3
RPT_print @ 4

Hvis du oppretter en Microsoft Foundation Class DLL hjelp av Visual Studio AppWizard, vil veiviseren generere et skjelett def fil for DLL og legge den til i prosjektet. Legg oppføringer for DLL funksjoner i denne def fil å eksportere dem. Formatet funksjonen prototype som brukes av kalleprogrammet må samsvare formatet funksjons oppføringer i def-filen. Enten bruke enkle definisjoner på begge steder, eller kompilator-spesifikke, kompilatorgenererte definisjoner på begge steder konsekvent.

Import og eksport Extension DLL-filer

En Microsoft Foundation Class forlengelse DLL består vanligvis av gjenbrukbare klasser som stammer fra eksisterende MFC klassetyper. 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. Slik eksporterer klasser i forlengelse DLL-filer, bruker makro "AFX_EXT_CLASS" før klassenavnet som dette:
Klasse AFX_EXT_CLASS CMyViewClass: public CView
{
// Klasse kroppen
};
Hvis du bruker en def fil, legge til følgende makrokode i begynnelsen og slutten av den utvidede DLL header filen:

udef AFX_DATAdefine AFX_DATA AFX_EXT_DATA

// <Body av topptekstfilen for den utvidede DLL>

udef AFX_DATAdefine AFX_DATA

Disse preprosessor direktiver sørge for at MFC variabler og avledninger og eksporteres fra den utvidede DLL.

Importere DLL funksjoner

Den andre siden av eksport gjenstander fra DLLs importerer dem inn i programmer som bruker "__declspec (DllImport)" søkeord.

Export C Funksjoner for bruk i C eller C ++ Kjør

Hvis kalle programmet eller funksjonen er skrevet i C ++, bruk "extern C" preprosessor direktivet i DLL header hvis DLL-funksjoner er skrevet i C.

Her er et eksempel:
// MyDLLFunctions.h

ifdef __cplusplus

Ekstern "C" {

slutt om

declspec (DllImport) void MyFunc01 ();
declspec (DllImport) void MyFunc02 ();

ifdef __cplusplus

} // end brak på "extern C" direktivet

slutt om

Som et alternativ til å spesifisere "Ekstern C" direktiv innen DLL header, kan du ta med DLL header fil med en "Ekstern" C "" wrapper betinget, som følger:

ifdef __cplusplus

Ekstern "C" {

endifinclude "DLLPATH \ MyDLLFunctions.h" ifdef __cplusplus

} // end brak på "extern C" direktivet

slutt om