Freigeben über


Exemplarische Vorgehensweise: Erstellen und Verwenden einer Dynamic Link Library (C++)

In dieser schrittweisen exemplarischen Vorgehensweise wird die Erstellung einer DLL (Dynamic Link Library) zur Verwendung mit einer App in C++ erläutert. Die Verwendung einer Bibliothek stellt eine gute Möglichkeit zur Wiederverwendung von Code dar. Anstatt die gleichen Routinen in jedem von Ihnen erstellten Programm erneut zu implementieren, schreiben Sie die Routinen einmal und verweisen dann in allen Apps, die diese Funktionen benötigen, darauf. Halten Sie bei Eingabe von Code in die DLL in jeder App, die darauf verweist, etwas Platz frei, dann können Sie die DLL aktualisieren, ohne alle Apps neu kompilieren zu müssen. Weitere Informationen über DLLs finden Sie unter DLLs in Visual C++.

In dieser exemplarischen Vorgehensweise werden die folgenden Aufgaben behandelt:

  • Erstellen eines DLL-Projekts

  • Hinzufügen einer Klasse zu einer DLL

  • Erstellen einer Konsolenanwendung, die zum Verweisen von DLLs dynamische Verknüpfung zur Ladezeit nutzt.

  • Verwenden von Funktionen der Klasse in der App.

  • Ausführen der App

In dieser exemplarischen Vorgehensweise wird eine DLL erstellt, die nur von Apps aufgerufen werden kann, die C++-Aufrufkonventionen verwenden. Informationen zum Erstellen von DLLs mit anderen Sprachen finden Sie unter Aufrufen von DLL-Funktionen aus Visual Basic-Anwendungen heraus.

Vorbereitungsmaßnahmen

In diesem Thema wird davon ausgegangen, dass Sie die Grundlagen der Programmiersprache C++ beherrschen.

  1. Wählen Sie in der Menüleiste Datei, Neu, Projekt aus.

  2. Erweitern Sie im linken Bereich des Dialogfeld Neues Projekt unter Installiert, Vorlagen, Visual C++, und wählen Sie Win32 aus.

  3. Wählen Sie im mittleren Bereich Win32-Konsolenanwendung aus.

  4. Geben Sie im Feld Name einen Namen für das Projekt ein, z. B. "MathFuncsDll". Geben Sie im Feld Projektmappenname einen Namen für die Projektmappe ein, z. B. "DynamicLibrary". Klicken Sie auf die Schaltfläche OK.

  5. Wählen Sie auf der Seite Übersicht des Dialogfelds Win32-Anwendungs-Assistent die Schaltfläche Weiter.

  6. Wählen Sie auf der Seite Anwendungseinstellungen unter Anwendungstyp die Option DLL aus.

  7. Wählen Sie die Schaltfläche Fertig stellen, um das Projekt zu erstellen.

So fügen Sie der Dynamic Link Library eine Klasse hinzu

  1. Um eine Headerdatei für eine neue Klasse zu erstellen, wählen Sie auf der Menüleiste Projekt, Neues Element hinzufügen aus. Wählen Sie im linken Bereich des Dialogfelds Neues Element hinzufügen unter Visual C++ die Option Code aus. Wählen Sie im mittleren Bereich die Option Headerdatei (.h). Geben Sie einen Namen für die Headerdatei an, z. B. "MathFuncsDll.h", und wählen Sie die Schaltfläche Hinzufügen aus. Eine leere Headerdatei wird angezeigt.

  2. Fügen Sie dem Anfang der Headerdatei den folgenden Code hinzu:

    // MathFuncsDll.h
    
    #ifdef MATHFUNCSDLL_EXPORTS
    #define MATHFUNCSDLL_API __declspec(dllexport) 
    #else
    #define MATHFUNCSDLL_API __declspec(dllimport) 
    #endif
    
  3. Fügen Sie eine Basisklasse mit dem Namen "MyMathFuncs" hinzu, die zur Ausführung der geläufigen mathematischen Operationen wie Addition, Subtraktion, Multiplikation und Division dient. Der Code sollte diesem ähneln:

    namespace MathFuncs
    {
        // This class is exported from the MathFuncsDll.dll
        class MyMathFuncs
        {
        public: 
            // Returns a + b
            static MATHFUNCSDLL_API double Add(double a, double b); 
    
            // Returns a - b
            static MATHFUNCSDLL_API double Subtract(double a, double b); 
    
            // Returns a * b
            static MATHFUNCSDLL_API double Multiply(double a, double b); 
    
            // Returns a / b
            // Throws const std::invalid_argument& if b is 0
            static MATHFUNCSDLL_API double Divide(double a, double b); 
        };
    }
    

    Wenn das Symbol "MATHFUNCSDLL_EXPORTS" definiert ist, wird das Symbol "MATHFUNCSDLL_API" den __declspec(dllexport)-Modifizierer in den Memberfunktionsdeklarationen in diesem Code festlegen. Dieser Modifizierer ermöglicht den Export der Funktion durch die DLL, sodass sie in anderen Anwendungen verwendet werden kann. Wenn MATHFUNCSDLL_EXPORTS undefiniert ist, beispielsweise wenn die Headerdatei in einer Anwendung enthalten ist, definiert MATHFUNCSDLL_API den __declspec(dllimport)-Modifizierer in den Memberfunktionsdeklarationen. Dieser Modifizierer optimiert den Import der Funktion in eine Anwendung. Standardmäßig fügt die Vorlage für ein neues Projekt für eine DLL PROJECTNAME_EXPORTS zu den definierten Symbolen für das DLL-Projekt hinzu. In diesem Beispiel wird MATHFUNCSDLL_EXPORTS bei Erstellung des MathFuncsDll-Projekts definiert. Weitere Informationen finden Sie unter dllexport, dllimport.

    Hinweis

    Wenn Sie das DLL-Projekt in der Befehlszeile erstellen, verwenden Sie die /D-Compileroption zum Definieren des "MATHFUNCSDLL_EXPORTS"-Symbols.

  4. Öffnen Sie im Projekt MathFuncsDll im Projektmappen-Explorer im Ordner Quelldateien das Element "MathFuncsDll.cpp".

  5. Implementieren Sie die Funktionalität von MyMathFuncs in der Quelldatei. Der Code sollte diesem ähneln:

    // MathFuncsDll.cpp : Defines the exported functions for the DLL application. 
    //
    
    #include "stdafx.h"
    #include "MathFuncsDll.h"
    #include <stdexcept>
    
    using namespace std;
    
    namespace MathFuncs
    {
        double MyMathFuncs::Add(double a, double b)
        {
            return a + b;
        }
    
        double MyMathFuncs::Subtract(double a, double b)
        {
            return a - b;
        }
    
        double MyMathFuncs::Multiply(double a, double b)
        {
            return a * b;
        }
    
        double MyMathFuncs::Divide(double a, double b)
        {
            if (b == 0)
            {
                throw invalid_argument("b cannot be zero!");
            }
    
            return a / b;
        }
    }
    
  6. Kompilieren Sie die DLL (Dynamic Link Library), indem Sie auf der Menüleiste Erstellen, Projektmappe erstellen auswählen.

    Hinweis

    Wenn Sie eine Express Edition verwenden, bei der kein Menü Erstellen auf der Menüleiste angezeigt wird, wählen Sie Tools, Einstellungen und Erweiterte Einstellungen aus, um es zu aktivieren, und wählen Sie dann Erstellen, Projektmappe erstellen aus.

    Hinweis

    Verwenden Sie beim Erstellen eines Projekts an der Befehlszeile die /LD-Compileroption, um anzugeben, dass als Ausgabedatei eine DLL erstellt werden soll.Weitere Informationen finden Sie unter /MD, /MT, /LD (Laufzeitbibliothek verwenden).Verwenden Sie die Compileroption /EHsc, um die Ausnahmebehandlung bei C++ zu aktivieren.Weitere Informationen finden Sie unter /EH (Ausnahmebehandlungsmodell).

So erstellen Sie eine App, die eine DLL verweist

  1. Um eine App in C++ zu erstellen, die auf die gerade auf der Menüleiste erstellte DLL verweist und sie verwendet, wählen Sie Datei, Neu und dann Projekt aus.

  2. Wählen Sie im linken Bereich unter Visual C++ die Option Win32 aus.

  3. Wählen Sie im mittleren Bereich Win32-Konsolenanwendung aus.

  4. Geben Sie im Feld Name einen Namen für das Projekt ein, z. B. "MyExecRefsDll". Wählen Sie in der Dropdownliste neben Projektmappe die Option Hinzufügen aus. Dadurch wird das neue Projekt der gleichen Projektmappe hinzugefügt, in der die DLL enthalten ist. Klicken Sie auf die Schaltfläche OK.

  5. Wählen Sie auf der Seite Übersicht des Dialogfelds Win32-Anwendungs-Assistent die Schaltfläche Weiter.

  6. Wählen Sie auf der Seite Anwendungseinstellungen unter Anwendungstyp die Option Konsolenanwendung aus.

  7. Deaktivieren Sie auf der Seite Anwendungseinstellungen unter Zusätzliche Optionen das Kontrollkästchen Vorkompilierter Header.

  8. Wählen Sie die Schaltfläche Fertig stellen, um das Projekt zu erstellen.

So verwenden Sie die Funktionalität der Klassenbibliothek in der App

  1. Nach dem Erstellen einer Konsolenanwendung wird ein leeres Programm für Sie erstellt. Die Quelldatei erhält denselben Namen, den Sie zuvor ausgewählt haben. In diesem Beispiel erhält die Quelldatei den Namen MyExecRefsDll.cpp.

  2. Um die in der DLL erstellten mathematischen Routinen in der App zu verwenden, müssen Sie auf die Bibliothek verweisen. Wählen Sie hierzu das Projekt "MyExecRefsDll" im Projektmappen-Explorer aus, und wählen Sie dann auf der Menüleiste Projekt, Verweise aus. Erweitern Sie im Dialogfeld Eigenschaftenseiten den Knoten Allgemeine Eigenschaften, wählen Sie Framework und Verweise aus, und wählen Sie dann die Schaltfläche Neuen Verweis hinzufügen aus. Weitere Informationen zum Dialogfeld Verweise finden Sie unter Framework und Verweise, Allgemeine Eigenschaften, Dialogfeld '<Projektname>-Eigenschaftenseiten'.

  3. Im Dialogfeld Verweis hinzufügen werden Bibliotheken aufgeführt, auf die Sie verweisen können. Auf der Registerkarte Projekt werden alle Projekte in der aktuellen Projektmappe und darin enthaltenen Bibliotheken aufgelistet. Aktivieren Sie auf der Registerkarte Projekte das Kontrollkästchen neben "MathFuncsDll", und wählen Sie dann die Schaltfläche OK aus.

  4. Um auf die Headerdateien der DLL zu verweisen, müssen Sie den enthaltenen Verzeichnispfad ändern. Erweitern Sie dazu im Dialogfeld Eigenschaftenseiten den Knoten Konfigurationseigenschaften, erweitern Sie den Knoten C/C++, und wählen Sie dann Allgemein aus. Geben Sie neben Zusätzliche Includeverzeichnisse den Pfad des Speicherorts der Headerdatei MathFuncsDll.h ein. Sie können einen relativen Pfad, z. B. ..\MathFuncsDll\, verwenden, wählen Sie dann die Schaltfläche OK aus.

  5. Nun können Sie die MyMathFuncs-Klasse in dieser Anwendung verwenden. Ersetzen Sie den Inhalt von MyExecRefsDll.cpp durch folgenden Code:

    // MyExecRefsDll.cpp 
    // compile with: /EHsc /link MathFuncsDll.lib
    
    #include <iostream>
    
    #include "MathFuncsDll.h" 
    
    using namespace std;
    
    int main()
    {
        double a = 7.4;
        int b = 99;
    
        cout << "a + b = " <<
            MathFuncs::MyMathFuncs::Add(a, b) << endl;
        cout << "a - b = " <<
            MathFuncs::MyMathFuncs::Subtract(a, b) << endl;
        cout << "a * b = " <<
            MathFuncs::MyMathFuncs::Multiply(a, b) << endl;
        cout << "a / b = " <<
            MathFuncs::MyMathFuncs::Divide(a, b) << endl;
    
        try
        {
            cout << "a / 0 = " <<
                MathFuncs::MyMathFuncs::Divide(a, 0) << endl; 
        }
        catch (const invalid_argument &e) 
        {
            cout << "Caught exception: " << e.what() << endl; 
        }
    
        return 0;
    }
    
  6. Erstellen Sie die ausführbare Datei, indem Sie auf der Menüleiste Erstellen, Projektmappe erstellen auswählen.

So führen Sie die Anwendung aus

  1. Stellen Sie sicher, dass "MyExecRefsDll" als Standardprojekt ausgewählt ist. Wählen Sie im Projektmappen-Explorer das Projekt "MyExecRefsDll" aus, und wählen Sie dann auf der Menüleiste die Option Projekt, Als Startprojekt festlegen aus.

  2. Wählen Sie zum Ausführen des Projekts auf der Menüleiste Debuggen, Starten ohne Debugging aus. Die Ausgabe sollte dieser Ausgabe ähneln:

a + b = 106,4 a – b = – 91,6 a * b = 732,6 a / b = 0,0747475 Abgefangene Ausnahme: b darf nicht 0 (null) sein!

Siehe auch

Aufgaben

Einführung in Visual C++

Exemplarische Vorgehensweise: Bereitstellen des Programms (C++)

Konzepte

DLLs in Visual C++

Aufrufen von DLL-Funktionen aus Visual Basic-Anwendungen heraus

Weitere Ressourcen

Desktopanwendungen (Visual C++) bereitstellen