Eine Dynamic Link Library oder DLL , kann eine Anwendung nur das notwendige Minimum ausführbaren Code in den Speicher laden zur Laufzeit. Immer, wenn das Programm eine Funktion in einer DLL aufruft , lädt das Betriebssystem die DLL im Speicher in Übereinstimmung mit den Spezifikationen Programmierers . Solange das laufende Programm bezieht sich nicht auf eine DLL-Funktion , die DLL muss nicht Raum einnehmen . Das spart eine Menge von Ressourcen und steigert die Leistung zur Laufzeit . Wenn die Bibliothek waren statisch, würden alle von der Bibliothek Code in das Hauptprogramm der ausführbaren Code angehängt werden und der Riese Programm müsste im Speicher für die gesamte Laufzeit zu bleiben. Der Unix -oder Linux- Version eines Windows- DLL ist eine gemeinsame Bibliothek , entsprechend mit der Erweiterung gebaut " . So . " Windows , Unix und Linux haben Konventionen auf Funktionen in DLLs oder gemeinsam genutzte Bibliotheken zugreifen . Export Windows DLL Objekte mit dllexport Keyword
Um eine Funktion , Klasse, Datenelement oder Elementfunktion zugänglich an den aufrufenden Windows-Programm zu machen , müssen Sie es zunächst exportieren . Eine Klasse oder Funktion während ihrer Definition unter dem Stichwort " __declspec (dllexport ) " exportiert werden , bevor die Funktion , Klasse oder variable Namen , wie folgt:
Void __ declspec (dllexport ) MyClass : public CObjectName { ..... }
Im DLL -Header-Datei , setzen Sie dieses Schlüsselwort vor dem Namen der Funktion in einem Prototyp Erklärung . Das Schlüsselwort " __declspec (dllexport ) " speichert die Namen der Funktionen in der DLL Export-Tabelle . Um den Raum , dass diese Tabelle belegt sparen, verwenden Ordnungszahlen statt Funktionsnamen .
Export Windows DLL Objekte Durch Moduldefinitionsdateien
Als Alternative zu dem Stichwort " __declspec (dllexport ) , "eine Moduldefinitionsdatei die den Namen der Bibliothek heißt , optionale Beschreibung und listet die Namen von Funktionen , Klassen und Variablen Daten in der DLL zusammen mit optionalen Ordinalwerte . Die Ordnungszahl Wert einer Funktion im Bereich von 1 bis N, wobei N die Anzahl der Funktionen in der DLL. Die Moduldefinitionsdatei hat die Erweiterung Nach ein Beispiel für eine Moduldefinitionsdatei oder eine DEF -Datei ist "DEF . . ": .
BIBLIOTHEK ReportWriterDESCRIPTION Diese dynamische Bibliothek enthält die Report-Generator Funktionalität MyProduct.RPT_setup @ 1RPT_design @ @ 2RPT_run 3RPT_print @ 4
Wenn Sie eine Microsoft Foundation Class DLL mit Visual Studio erstellen Assistenten , der Assistent ein Skelett . DEF -Datei für die DLL erzeugen und fügen Sie ihn in das Projekt. Fügen Sie Einträge für DLL-Funktionen in diesem . DEF-Datei zu exportieren . Das Format der Prototyp einer Funktion durch das aufrufende Programm verwendet wird, muss dem Format der Einträge in der Funktion . DEF -Datei. Entweder verwenden einfache Definitionen in beiden Orten oder Compiler -spezifische , Definitionen in beiden Orten konsequent .
Import und Export Erweiterungs-DLLs
Microsoft Compiler generierten Foundation Class -Erweiterungs-DLL besteht typischerweise aus wiederverwendbare Klassen aus vorhandenen MFC-Klasse -Typen abgeleitet. Sie sind gebaut, mit einer DLL-Version von MFC und kann von Anwendungen und DLLs gebaut mit diesen freigegebenen Version von MFC aufgerufen werden. Um Klassen in Erweiterungs-DLLs exportieren, verwenden Sie das Makro " AFX_EXT_CLASS " vor den Namen der Klasse wie folgt : Klasse AFX_EXT_CLASS CMyViewClass : public CView {//Klasse body} ; Wenn Sie eine DEF-Datei , fügen Sie den folgenden Makro -Code am Anfang. und Ende der verlängerten DLL -Header-Datei : # undef AFX_DATA # define AFX_DATA AFX_EXT_DATA //
# undef AFX_DATA # define AFX_DATA
Diese Präprozessordirektiven sicherstellen, dass die MFC Variablen und Ableitungen und exportiert aus dem erweiterten DLL.
Importieren DLL-Funktionen
die andere Seite der Export von Objekten aus DLLs importiert sie in Anwendungen mit Hilfe der " __declspec (dllimport ) "Stichwort .
Export C -Funktionen zur Verwendung in C oder C + + Executables
Wenn das aufrufende Programm oder eine Funktion in C geschrieben ist + + , verwenden Sie die " extern C " Präprozessordirektive in der DLL -Header , wenn die DLL-Funktionen in C
geschrieben Hier ist ein Beispiel ://# ifdef __ MyDLLFunctions.h cplusplusExtern "C" {# endif__declspec (dllimport ) nichtig MyFunc01 (); __declspec (dllimport ) Leere MyFunc02 (); # ifdef __ cplusplus } //end Konsolen für "extern C "-Direktive # endif
Als Alternative zur Angabe der "Extern C " Richtlinie innerhalb der DLL -Header , können Sie die DLL- Header-Datei mit einem " Extern " C " " Wrapper bedingt , wie folgt:
# ifdef __ cplusplusExtern "C" { # endif
# include " DllPath \\ MyDLLFunctions.h "
# ifdef __ cplusplus } //end Konsolen für "extern C "-Direktive # endif