Procedura dettagliata: creazione e utilizzo di una libreria a collegamento dinamico (C++)

In questa procedura dettagliata, viene illustrato come creare una Libreria dinamica (DLL) per essere utilizzata con un'applicazione C++.L'utilizzo di una libreria è un ottima modalità di riutilizzo del codice.Anziché implementare le stesse routine in tutti i programmi creati, è possibile scriverle una sola volta e fare riferimento ad esse da applicazioni che ne richiedono le funzionalità.Inserendo il codice in una DL, risparmiate lo spazio in ogni applicazione a cui si fa riferimento, è possibile aggiornare la DLL senza ricompilare tutte le applicazioni.Per ulteriori informazioni sulle DLL, vedere DLL di Visual C++.

Nella procedura dettagliata vengono illustrate le seguenti attività:

  • Creazione di una progetto DDL

  • Aggiunta di una classe ad una DDL.

  • Crea un'applicazione console che utilizza il collegamento dinamico in fase di caricamento per fare riferimento ad una DLL.

  • Utilizzare le funzionalità della classe nell'applicazione.

  • Eseguire l'applicazione.

In questa procedura dettagliata verrà creata una DLL che può essere chiamata dall'applicazione che utilizza convenzioni di chiamata C++.Per informazioni su come creare le DLL da utilizzare con altri linguaggi, vedere Chiamata di funzioni DLL da applicazioni Visual Basic.

Prerequisiti

In questo argomento si presuppone la conoscenza delle nozioni di base del linguaggio C++.

Per creare un Libreria dinamica (DLL)

  1. Nella barra del menu, scegliere File, Nuovo, Progetto.

  2. Nel riquadro sinistro della finestra di dialogo Nuovo progetto, espandere Installato, Modelli, Visual C++, quindi selezionare Win32

  3. Nel riquadro centrale, selezionare Applicazione console Win32.

  4. Specificare il nome per il progetto—per esempio, MathFuncsDll—nella casella Nome.Specificare un nome per la soluzione—ad esempio, DynamicLibrary—nella casella Nome soluzione.Scegliere il pulsante OK.

  5. Nella pagina Panoramica, dalla finestra di dialogo Creazione guidata applicazione Win32, fare clic sul pulsante Avanti.

  6. Nella pagina Impostazioni applicazione, incluso in Tipo di applicazione, selezionare DLL.

  7. Scegliere il pulsante Fine per creare il progetto.

Per aggiungere una classe alla libreria a collegamento dinamico

  1. Per creare un file di intestazione per una nuova classe, nella barra dei menu, scegliere Progetto, Aggiungi nuovo elemento.Nella finestra di dialogo Aggiungi nuovo elemento, nel riquadro sinistro, in Visual C++, selezionare Codice.Nel riquadro centrale, selezionare File di intestazione (.h).Specificare un nome per l'intestazione file—ad esempio, MathFuncsDll.h—quindi premere il pulsante Aggiungi.Viene visualizzato un file di intestazione vuoto.

  2. Aggiungere il seguente codice all'inizio del file di intestazione:

    // MathFuncsDll.h
    
    #ifdef MATHFUNCSDLL_EXPORTS
    #define MATHFUNCSDLL_API __declspec(dllexport) 
    #else
    #define MATHFUNCSDLL_API __declspec(dllimport) 
    #endif
    
    
  3. Aggiungere una semplice classe denominata MyMathFuncs, per eseguire operazioni matematiche di base come addizione, sottrazione, moltiplicazione e divisione.Il codice sarà simile a quello riportato di seguito:

    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); 
        };
    }
    

    Quando il simbolo MATHFUNCSDLL_EXPORTS viene definito, il simbolo MATHFUNCSDLL_API imposterà il modificatore __declspec(dllexport) nelle dichiarazioni della funzione membro in questo codice.Questi modificatori consentono l'esportazione della funzione tramite DLL così da permettere l'utilizzo in altre applicazioni.Quando MATHFUNCSDLL_EXPORTS è definito, MATHFUNCSDLL_API definisce il modificatore __declspec(dllimport) nelle dichiarazioni della funzione membro.Questo modificatore consente al compilatore di incorporare e ottimizzare la funzione definita nella DLL, per utilizzarla in altre applicazioni.Per impostazione predefinita, MATHFUNCSDLL_EXPORTS viene definita quando il progetto MathFuncsDll viene compilato.Per ulteriori informazioni, vedere dllexport, dllimport.

    [!NOTA]

    Se si compila il progetto di DLL nella riga di comando, utilizzare l'opzione del compilatore /D per definire il simbolo MATHFUNCSDLL_EXPORTS.

  4. Nel progetto MathFuncsDll in Esplora soluzioni, nella cartella File di origine, aprire MathFuncsDll.cpp.

  5. Implementare la funzionalità per MyMathFuncs nel file di origine.Il codice sarà simile a quello riportato di seguito:

    // 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. Compilare le Libreria a collegamento dinamico, scegliendo Compila, nella barra dei menu Compila soluzione.

    [!NOTA]

    Se si utilizza un Express edition viene visualizzato il menu Compila, nella barra dei menu, scegliere Strumenti, Impostazioni, Impostazioni avanzate per abilitarla, quindi scegliere Compila, Compila soluzione.

    [!NOTA]

    Se si esegue la compilazione di un progetto da riga di comando, utilizzare l'opzione del compilatore /LD per specificare che il file di output deve essere una DLL.Per ulteriori informazioni, vedere /MD, /MT, /LD (Utilizza la libreria di runtime).Utilizzare l'opzione del compilatore /EHsc per abilitare la gestione delle eccezioni C++.Per ulteriori informazioni, vedere /EH (Modello di gestione delle eccezioni).

Per creare un'applicazione che fa riferimento ad una DLL

  1. Per creare un'applicazione C++ che fa riferimento e utilizza le DLL appena create, sulla barra dei menu, scegliere File, Nuovo, Progetto.

  2. Nel riquadro sinistro, in Visual C++, selezionare Win32.

  3. Nel riquadro centrale, selezionare Applicazione console Win32.

  4. Specificare un nome per il progetto—ad esempio, MyExecRefsDll—nella casella Nome.Accanto a Soluzione, selezionare dall'elenco a discesa Aggiungi a soluzione.Ciò aggiunge, il nuovo progetto, nella stessa soluzione contenente le DLL.Scegliere il pulsante OK.

  5. Nella pagina Panoramica, dalla finestra di dialogo Creazione guidata applicazione Win32, fare clic sul pulsante Avanti.

  6. Nella pagina Impostazioni applicazione, in Tipo di applicazione selezionare Applicazione console.

  7. Nella pagina Impostazioni applicazione, in Opzioni aggiuntive, cancellare la casella di controllo Intestazione precompilata .

  8. Scegliere il pulsante Fine per creare il progetto.

Per utilizzare una funzionalità della libreria di classi nell'applicazione

  1. Dopo la creazione di un'applicazione console verrà creato un programma vuoto.Il nome del file sorgente sarà uguale al nome scelto in precedenza per il progetto.In questo esempio, il file è denominato MyExecRefsDll.cpp.

  2. Per utilizzare nell'applicazione le routine matematiche create nelle DLL, è necessario fare riferimento ad esse.Per fare questo, selezionare il progetto MyExecRefsDll in Esplora soluzione, e quindi scegliere dalla barra dei menu Progetto, Riferimenti.Nella finestra di dialogo Pagine delle proprietà, espandere il nodo Proprietà comuni, selezionare Framework e riferimenti, quindi fare clic sul pulsante Aggiungi nuovo riferimento.Per ulteriori informazioni sulla finestra di dialogo Riferimenti, vedere Framework e riferimenti, Proprietà comuni, finestra di dialogo Pagine delle proprietà di <nomeprogetto>.

  3. La finestra di dialogo Aggiungi riferimento, contiene l'elenco di tutte le librerie a cui è possibile fare riferimento.Nell'elenco di schede Progetto, sono elencati tutti i progetti della soluzione corrente e le eventuali librerie che li contengono.Nella scheda Progetti, selezionare la casella di controllo accanto a MathFuncsDll, quindi scegliere il pulsante OK.

  4. Per fare riferimento ai file di intestazione delle DLL, è necessario modificare il percorso delle directory di inclusione.A tal fine, nella finestra di dialogo Pagine delle proprietà, espandere il nodo Proprietà di configurazione, il nodo C/C++, quindi selezionare Generale.Accanto a Directory di inclusione aggiuntive, specificare il percorso del file di intestazione MathFuncsDll.h.È possibile utilizzare un percorso relativo—ad esempio, ..\ MathFuncsDll \ — quindi scegliere il pulsante OK.

  5. È ora possibile utilizzare la classe MyMathFuncs nell'applicazione.Sostituire il contenuto di MyExecRefsDll.cpp con il codice seguente:

    // 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. Compilare il file eseguibile scegliendo Compila e dalla barra dei menu Compila soluzione.

Per eseguire l'applicazione

  1. Assicurarsi che MyExecRefsDll sia selezionato come progetto predefinito.In Esplora soluzioni, selezionare MyExecRefsDll, quindi selezionare dalla barra dei menu Progetto, Imposta come progetto di avvio.

  2. Per eseguire il progetto, dalla barra dei menu selezionare Debug, Avvia senza eseguire debug.Il codice sarà analogo al seguente:

a + b = 106,4 a e b = -91,6 a * b = 732,6 a e b = 0,0747475 Eccezione intercettata: b non può essere zero!

Passaggi successivi

Precedente:DLL di Visual C++ | Successivo:Procedura: creare librerie di classi

Vedere anche

Attività

Visual C++ Guided Tour

Walkthrough: Deploying Your Program (C++)

Concetti

DLL di Visual C++

Chiamata di funzioni DLL da applicazioni Visual Basic

Altre risorse

Distribuzione delle applicazioni desktop (Visual C++)