Programmiertools richtig nutzen

Die DLL und der Kreis - Teil II

Einzig das Makro AFX_EXT_CLASS ist noch etwas Besonderes Dabei ist es sogar besonders wichtig denn dieses Makro ist dafür zuständig das Ihre Kreis Klasse später wieder verwendet werden kann Und das hat einen einfachen Grund Wie bereits erwähnt wird diese Header Datei ja sowohl von dem Projekt inkludiert das die Circle Klasse implementiert als auch von dem Projekt das die Implementierung der Circle Klasse verwenden will Beim Implementieren der Circle Klasse muss dem Compiler und dem Linker also mitgeteilt werden dass die Klasse Circle exportiert werden soll Soll die Klasse aber in einem anderen Projekt wieder verwendet werden dann muss der Compiler bzw der Linker dort wissen dass es sich um eine zu importierende Klasse handelt Mit einem Wort Die Header Datei muss im einen Fall anders übersetzt werden als im anderen Um dem Compiler mitzuteilen dass es sich bei einer Klasse um eine zu im oder zu exportierende Klasse handelt gibt es das Schlüsselwort __declspec das einen Parameter erwartet Um nun eine Klasse zu exportieren verwendet man __declspec mit dem Parameter dllexport class __declspec dllexport NameDerKlasse Soll die Klasse hingegen importiert werden so verwenden man dllimport class __declspec dllimport NameDerKlasse Man hat aber natürlich nur eine Quellcode Datei Es bleibt also nichts anderes übrig als die unterschiedlichen Statements vom Präprozessor erzeugen zu lassen Das funktioniert so dass das Makro AFX_EXT_CLASS in einem MFC Extension DLL Projekt als __declspec dllexport definiert ist während es bei einem MFC Anwendungsprojekt als __declspec dllimport definiert ist Mit anderen Worten Je nach dem was man gerade übersetzt ist das AFX_EXT_CLASS Makro anders definiert und das führt dazu dass das __declspec Statement richtig gesetzt ist Sie können so etwas auch selbst zusammenbauen Dazu würden Sie in der Circle Header Datei in etwa folgende Statements zusammenbauen ifndef _BUILD_DLL_CIRCLE define __declspec dllimport __IMPORTEXPORT else define __declspec dllexport __IMPORTEXPORT endif Danach könnten Sie dann statt AFX_EXT_CLASS auch __IMPORTEXPORT verwenden Sie müssten dann allerdings beim übersetzen der DLL dafür sorgen dass das Macro _BUILD_DLL_CIRCLE gesetzt ist Das geht über die Präprozessor Optionen im Dialog zum Einstellen der Projekt Eigenschaften Im Header File gibt es noch eine weitere Sache die Sie klären können Aber dazu müssen Sie sich zunächst einmal eine Frage stellen Wenn die Circle Klasse wieder verwendet werden soll woher wei dann der Linker in welcher Datei er nach der Implementierung suchen soll Dazu gibt es ein weiteres Preäprozessor Statement pragma comment lib dll_imp lib Mit diesem Statement weisen Sie den Präprozessor an dafür sorgen zu tragen das der Linker im Objekt Code einen Eintrag zu sehen bekommt der auf die Verwendung der Library dll_imp lib hinweist Dadurch wird bekannt das diese Library verwendet wird und das Sie zu durchsuchen ist Im Beispiel wurde allerdings ein anderer Weg gewählt der später erläutert werden wird Allerdings sind Sie vielleicht beim pragma stutzig geworden Denn hier wird plötzlich auf eine lib Datei verwiesen dabei soll doch eigentlich eine DLL Datei erzeugt werden Das ist auch richtig aber die DLL Datei alleine reicht nicht aus Immer wenn Sie eine DLL erzeugen dann erzeugt der Linker auch noch eine LIB Datei Dabei handelt es sich mehr oder minder um eine normale statische Bibliothek allerdings mit einem speziellen Namen LIB Dateien die zu DLL Dateien gehören nennt man import library Die Import Library lib ist nur für den Linker da der ausführbare Code befindet sich in der DLL Datei Diese Libraries haben einen ganze Speziellen Zweck Die DLL selbst wird ja vom fertigen Programm erst zur Laufzeit geladen Das bedeutet zum Zeitpunkt des Linkens muss diese Datei noch gar nicht vorliegen Wie aber soll dann der Linker feststellen das auch tatsächlich alle verwendeten Symbole aufgelösst werden können schlie lich liegen diese ja zum Teil in einer DLL vor Genau diese Frage beantwortet eine Import Library Diese enthält keinen ausführbaren Code sondern nur eine Information für den Linker welche Symbole in der DLL definiert sind Auf diese Weise kann überprüft werden ob alle Symbole definiert sind ohne dass die Datei in der die Symbole vorliegen bereits vorhanden sein müssen Der Vorteil Man braucht keinen speziellen Linker der auch DLLs lesen kann

P
Computerwissen komplett aus einer Hand

Dies ist eine Nickles-Premium Seite

Der Inhalt dieser Seite ist nur Nickles Mitgliedern zugänglich. Bitte melden Sie sich mit Ihrem Premium-Account an, um diese Seite lesen zu können.

Sollten Sie bisher noch nicht über einen Account verfügen, so können Sie sich hier einen erstellen und erhalten damit Zugriff auf das gesammelte Computerwissen, alle Artikel, Tipps und vieles mehr. Zusätzlich sehen Premium-Mitglieder Nickles werbefrei.

  • Probleme mit Hard und Software müssen nicht mehr sein
  • Nickles liefert seit über 15 Jahren geballtes Wissen
  • Unverzichtbare Artikel, verständlich für alle
  • Wertvolle Tipps die bares Geld sparen
  • Schluss mit Suchen - alles hier aus einer Hand
  • Zuverlässige Profi-Informationen statt Blabla
  • Hier gibt es Zugriff auf über 2 Millionen Webseiten geballtes Computerwissen zum Schnäppchenpreis
Computerwissen komplett aus einer Hand (Angebot 1)

UNABHÄNGIG, EHRLICH, VERSTÄNDLICH

Drei Worte. Die schreiben wir nicht nur, das meinen wir auch so! Nickles-Artikel liefern konkrete unbestechliche Informationen. Egal ob für PC-Laie oder PC-Profi: auf Nickles-Infos ist Verlass! Bereits ein einziger Nickles-Artikel kann helfen, viel Zeit und Geld zu sparen!

  • Probleme mit Hard und Software müssen nicht mehr sein
  • Nickles liefert seit über 15 Jahren geballtes Wissen
  • Unverzichtbare Artikel, verständlich für alle
  • Schluss mit Suchen - alles hier aus einer Hand
  • Zuverlässige Profi-Informationen statt Blabla
  • Hier gibt es Zugriff auf über 2 Millionen Webseiten geballtes Computerwissen zum Schnäppchenpreis

Allgemeine Geschäftsbedingungen

Wir hassen lange AGB mit fiesem Kleingedrucktem. Drum sind unsere kurz und einfach - bitte sorgfältig durchlesen:
AGB - Allgemeine Geschäftsbedingungen

Bestellformular ausfüllen

Die Abrechnung der 59,95 Euro für 12 Monate erfolgt einfach per Rechnung auf dem Postweg. Dazu benötigen wir die Anschrift. Bitte alle Felder ausfüllen!

Mit * markierte Felder werden für die Bearbeitung der Bestellung benötigt und müssen ausgefüllt werden.
Hinweis: Nickles.de gibt Daten niemals weiter! Sie dienen nur für unsere interne Abwicklung der Mitgliedschaft.

Gesamtpreis: 59,95 Euro für 12 Monate
(inklusive 7 Prozent MwSt, 3,92 Euro auf 56,03 Euro)
Vereinbarungen: Widerrufsrecht: Diese Bestellung kann gemäß AGB innerhalb von zwei Wochen widerrufen werden.

Mindestlaufzeit: 12 Monate

Verlängerung: Wird nicht spätestens drei Monate vor Ablauf der Abrechnungsperiode gekündigt, verlängert sich die Premiummitgliedschaft um 12 Monate zum Preis von 59,95 Euro.
Abrechnungsperiode dann alle 12 Monate.