Share via


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

Il primo tipo di libreria da creare a una libreria a collegamento dinamico (DLL). L'utilizzo di DLL è un ottimo modo per riutilizzare il codice. Anziché implementare le stesse routine in tutti i programmi creati, è possibile scriverle una sola volta e fare riferimento a esse da applicazioni che ne richiedono le funzionalità.

Questa procedura dettagliata include:

  • Creazione di un nuovo progetto DLL.

  • Aggiunta di una classe alla libreria a collegamento dinamico.

  • Creazione di un'applicazione che fa riferimento alla libreria a collegamento dinamico.

  • Utilizzo della funzionalità della libreria di classi nell'applicazione console.

  • Esecuzione dell'applicazione.

Prerequisiti

In questo argomento si presuppone la conoscenza delle nozioni di base del linguaggio C++. Chi sta iniziando ad apprendere le prime nozioni di C++ troverà particolarmente utile il testo "C++ Beginner's Guide" scritto da Herb Schildt, disponibile online all'indirizzo https://go.microsoft.com/fwlink/?LinkId=115303 (informazioni in lingua inglese).

Per creare un nuovo progetto DLL

  1. Scegliere Nuovo dal menu File e quindi Progetto....

  2. Nel riquadro Tipi progetto fare clic sul nodo Visual C++, quindi selezionare Win32.

  3. Nel riquadro Modelli selezionare Applicazione console Win32.

  4. Scegliere un nome per il progetto, ad esempio MathFuncsDll, e digitarlo nel campo Nome. Scegliere un nome per la soluzione, ad esempio DynamicLibrary, e digitarlo nel campo Nome soluzione.

  5. Scegliere OK per avviare la Creazione guidata applicazione Win32. Nella pagina Panoramica della finestra di dialogo Creazione guidata applicazione Win32 fare clic su Avanti.

  6. Dalla pagina Impostazioni applicazione della Creazione guidata applicazione Win32, in Tipo applicazione, selezionare DLL oppure Applicazione console se DLL non è disponibile. Alcune versioni di Visual Studio non supportano la creazione di un progetto DLL tramite le procedure guidate. È possibile modificare successivamente l'impostazione per compilare il progetto in una DLL.

  7. Dalla pagina Impostazioni applicazione della Creazione guidata applicazione Win32, in Opzioni aggiuntive, selezionare Progetto vuoto.

  8. Scegliere 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, scegliere Aggiungi nuovo elemento... dal menu Progetto. Verrà visualizzata la finestra di dialogo Aggiungi nuovo elemento. Nel riquadro Categorie in Visual C++ selezionare Codice. Nel riquadro Modelli selezionare File di intestazione (.h). Scegliere un nome per il file di intestazione, ad esempio MathFuncsDll.h, e fare clic su Aggiungi. Verrà visualizzato un file vuoto.

  2. Aggiungere una classe semplice denominata MyMathFuncs per eseguire operazioni matematiche comuni, come addizione, sottrazione, moltiplicazione e divisione. Il codice dovrebbe essere analogo al seguente:

    // MathFuncsDll.h
    
    namespace MathFuncs
    {
        class MyMathFuncs
        {
        public:
            // Returns a + b
            static __declspec(dllexport) double Add(double a, double b);
    
            // Returns a - b
            static __declspec(dllexport) double Subtract(double a, double b);
    
            // Returns a * b
            static __declspec(dllexport) double Multiply(double a, double b);
    
            // Returns a / b
            // Throws DivideByZeroException if b is 0
            static __declspec(dllexport) double Divide(double a, double b);
        };
    }
    
  3. Notare il modificatore __declspec(dllexport) nelle dichiarazioni di metodo riportate nel codice. Questi modificatori consentono l'esportazione del metodo tramite la DLL in modo da permetterne l'utilizzo in altre applicazioni. Per ulteriori informazioni, vedere dllexport, dllimport.

  4. Per creare un file di origine per una nuova classe, scegliere Aggiungi nuovo elemento... dal menu Progetto. Verrà visualizzata la finestra di dialogo Aggiungi nuovo elemento. Nel riquadro Categorie in Visual C++ selezionare Codice. Nel riquadro Modelli selezionare File di C++ (.cpp). Scegliere un nome per il file di origine, ad esempio MathFuncsDll.cpp, e fare clic su Aggiungi. Verrà visualizzato un file vuoto.

  5. Implementare la funzionalità per MyMathFuncs nel file di origine. Il codice dovrebbe essere analogo al seguente:

    // MathFuncsDll.cpp
    // compile with: /EHsc /LD
    
    #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 new invalid_argument("b cannot be zero!");
            }
    
            return a / b;
        }
    }
    
  6. Per compilare il progetto in una DLL, selezionare Proprietà di MathFuncsDll dal menu Progetto. Nel riquadro sinistro in Proprietà di configurazione selezionare Generale. Nel riquadro destro modificare Tipo configurazione in Libreria dinamica (.dll). Scegliere OK per salvare le modifiche.

    Nota

    Se si esegue la compilazione dalla 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 (Use Run-Time Library).

  7. Compilare la libreria a collegamento dinamico scegliendo Compila soluzione dal menu Compila. Verrà creata una DLL utilizzabile da altri programmi. Per ulteriori informazioni sulle DLL, vedere DLL.

Per creare un'applicazione che fa riferimento alla libreria a collegamento dinamico

  1. Per creare un'applicazione che farà riferimento e utilizzerà la libreria a collegamento dinamico appena creata, scegliere Nuovo dal menu File e quindi Progetto….

  2. Nel riquadro Tipi progetto fare clic sul nodo Visual C++, quindi selezionare Win32.

  3. Nel riquadro Modelli selezionare Applicazione console Win32.

  4. Scegliere un nome per il progetto, ad esempio MyExecRefsDll, e digitarlo nel campo Nome. Accanto a Soluzione selezionare Aggiungi a soluzione dall'elenco a discesa. Il nuovo progetto verrà aggiunto alla stessa soluzione della libreria a collegamento dinamico.

  5. Fare clic su OK per avviare la Creazione guidata applicazione Win32. Nella pagina Panoramica della finestra di dialogo Creazione guidata applicazione Win32 fare clic su Avanti.

  6. Dalla pagina Impostazioni applicazione della Creazione guidata applicazione Win32 in Tipo applicazione selezionare Applicazione console.

  7. Nella pagina Impostazioni applicazione della Creazione guidata applicazione Win32 in Opzioni aggiuntive deselezionare la casella di controllo Intestazione precompilata.

  8. Scegliere Fine per creare il progetto.

Per utilizzare la funzionalità della libreria di classi nell'applicazione console

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

  2. Per utilizzare le routine matematiche create nella libreria a collegamento dinamico, è necessario fare riferimento a essa A tale scopo, selezionare il progetto MyExecRefsDll in Esplora soluzioni, quindi scegliere Riferimenti dal menu Progetto. 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. Verrà visualizzata la finestra di dialogo Aggiungi riferimento. nella quale sono elencate tutte le librerie a cui è possibile fare riferimento. Nella scheda Progetto sono elencati tutti i progetti nella soluzione corrente e le eventuali librerie che contengono. Nella scheda Progetti selezionare MathFuncsDll. Quindi scegliere OK.

  4. Per fare riferimento ai file di intestazione della libreria a collegamento dinamico, è 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 digitare il percorso del file di intestazione MathFuncsDll.h.

  5. Le librerie a collegamento dinamico non vengono caricate dall'eseguibile fino al runtime. È necessario segnalare al sistema dove si trova il file MathFuncsDll.dll. Questa operazione viene eseguita tramite la variabile di ambiente PATH. Nella finestra di dialogo Pagine delle proprietà espandere il nodo Proprietà di configurazione e selezionare Debug. Accanto alla casella Ambiente, digitare quanto segue: percorso PATH=< del file MathFuncsDll.dll >, dove il percorso < del file MathFuncsDll.dll> viene sostituito con la posizione effettiva del file MathFuncsDll.dll. Scegliere OK per salvare tutte le modifiche.

    Nota

    Se si intende eseguire il file eseguibile dalla riga di comando anziché da Visual Studio, è necessario aggiornare manualmente la variabile di ambiente PATH dalla riga di comando come segue: percorso set PATH=%PATH%;<del file MathFuncsDll.dll >, dove <percorso del file MathFuncsDll.dll> viene sostituito con la posizione effettiva del file MathFuncsDll.dll.

  6. È 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;
    
        return 0;
    }
    
  7. Compilare l'eseguibile scegliendo Compila soluzione dal menu Compila.

Per eseguire l'applicazione

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

  2. Per eseguire il progetto, scegliere Avvia senza eseguire debug dal menu Debug. Il codice sarà analogo al seguente:

    a + b = 106.4
    a - b = -91.6
    a * b = 732.6
    a / b = 0.0747475
    

Passaggi successivi

Precedente: Creazione di codice riutilizzabile (C++) | Successivo: Procedura dettagliata: creazione e utilizzo di una libreria statica (C++)

Vedere anche

Attività

Presentazione guidata di Visual C++

Procedura dettagliata: distribuzione di un programma (C++)

Concetti

DLL

Altre risorse

Metodologie di programmazione in Visual C++

Distribuzione (Visual C++)