Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier les répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer de répertoire.
Cette procédure pas à pas explique comment utiliser l’IDE Visual Studio pour créer votre propre bibliothèque de liens dynamiques (DLL) écrite dans Microsoft C++ (MSVC) et comment utiliser la DLL à partir d’une autre application C++. Les DLL, également appelées bibliothèques partagées dans les systèmes d’exploitation UNIX, sont l’un des types les plus utiles de composants Windows. Vous pouvez les utiliser pour partager du code et des ressources, et réduire la taille de vos applications. Les DLL peuvent même faciliter le service et l’extension de vos applications.
Dans cette procédure pas à pas, vous créez une DLL qui implémente certaines fonctions mathématiques. Ensuite, vous créez une application console qui utilise les fonctions de la DLL. Vous obtenez également une introduction à certaines des techniques et conventions de programmation utilisées dans les DLL Windows.
Cette procédure pas à pas décrit les étapes suivantes :
- Créez un projet DLL dans Visual Studio.
- Ajoutez des fonctions et des variables exportées à la DLL.
- Créez un projet d’application console dans Visual Studio.
- Utilisez les fonctions et variables importées à partir de la DLL dans l’application console.
- Exécutez l’application terminée.
Comme une bibliothèque liée statiquement, une DLL exporte des variables, des fonctions et des ressources par nom. Une application cliente importe les noms pour utiliser ces variables, fonctions et ressources. Contrairement à une bibliothèque liée statiquement, Windows connecte les importations dans votre application aux exportations dans une DLL au moment du chargement ou au moment de l’exécution, au lieu de les connecter au moment du lien. Windows nécessite des informations supplémentaires qui ne font pas partie du modèle de compilation C++ standard pour établir ces connexions. Le compilateur MSVC implémente certaines extensions spécifiques à Microsoft à C++ pour fournir ces informations supplémentaires. Nous expliquons ces extensions au fur et à mesure.
Cette procédure pas à pas crée deux solutions Visual Studio : une qui génère la DLL et une qui génère l’application cliente. La DLL utilise la convention d’appel C. Il peut être appelé à partir d’applications écrites dans d’autres langages de programmation, tant que la plateforme, les conventions d’appel et les conventions de liaison correspondent. L’application cliente utilise la liaison implicite, où Windows lie l’application à la DLL au moment du chargement. Cette liaison permet à l’application d’appeler les fonctions fournies par DLL comme les fonctions d’une bibliothèque liée statiquement.
Cette procédure pas à pas ne couvre pas certaines situations courantes. Le code n’affiche pas l’utilisation de DLL C++ par d’autres langages de programmation. Il ne montre pas comment créer une DLL de ressource uniquement ou comment utiliser une liaison explicite pour charger des DLL au moment de l’exécution plutôt qu’au moment du chargement. Restez assuré que vous pouvez utiliser MSVC et Visual Studio pour effectuer toutes ces opérations.
Même si le code de la DLL est écrit en C++, nous utilisons des interfaces de style C pour les fonctions exportées. Il existe deux raisons principales pour cela : Tout d’abord, de nombreux autres langages prennent en charge les importations de fonctions de style C. L’application cliente n’a pas besoin d’être écrite en C++. Ensuite, il évite certains pièges courants liés aux classes exportées et aux fonctions membres. Il est facile de faire des erreurs difficiles à diagnostiquer lors de l’exportation de classes, car tout ce qui fait référence dans une déclaration de classe doit avoir une instanciation qui est également exportée. Cette restriction s’applique aux DLL, mais pas aux bibliothèques statiques. Si vos classes sont de style simple de données anciennes, vous ne devez pas résoudre ce problème.
Pour plus d’informations sur les DLL, consultez Créer des DLL C/C++ dans Visual Studio. Pour plus d’informations sur la liaison implicite et la liaison explicite, consultez Déterminer la méthode de liaison à utiliser. Pour plus d’informations sur la création de DLL C++ à utiliser avec des langages de programmation qui utilisent des conventions de liaison de langage C, consultez Exportation des fonctions C++ pour une utilisation dans les exécutables en langage C. Pour plus d’informations sur la création de DLL à utiliser avec des langages .NET, consultez Appel de fonctions DLL à partir d’applications Visual Basic.
Prerequisites
- Microsoft Windows 7 ou version ultérieure. Nous vous recommandons la dernière version de Windows pour la meilleure expérience de développement.
Visual Studio. Pour savoir comment télécharger et installer Visual Studio, consultez Installer Visual Studio. Lorsque vous exécutez le programme d’installation, vérifiez que la charge de travail Développement d'applications de bureau avec C++ est cochée. Ne vous inquiétez pas si vous n’avez pas installé cette charge de travail lorsque vous avez installé Visual Studio. Vous pouvez réexécuter le programme d’installation et l’installer maintenant.
- Visual Studio. Pour plus d’informations sur le téléchargement et l’installation de Visual Studio 2015, consultez Installer Visual Studio 2015. Utilisez une installation personnalisée pour installer le compilateur et les outils C++, car ils ne sont pas installés par défaut.
Compréhension des principes de base de l’utilisation de l’IDE Visual Studio. Si vous avez déjà utilisé des applications de bureau Windows, vous pouvez probablement continuer. Pour une présentation, consultez la visite guidée des fonctionnalités de l’IDE Visual Studio.
Vous connaissez bien le langage C++. Ne vous inquiétez pas, nous ne faisons rien de trop compliqué.
Note
Cette procédure pas à pas suppose que vous utilisez Visual Studio 2017 version 15.9 ou ultérieure. Certaines versions antérieures de Visual Studio 2017 avaient des défauts dans les modèles de code ou utilisaient différentes boîtes de dialogue d’interface utilisateur. Pour éviter les problèmes, utilisez Visual Studio Installer pour mettre à jour Visual Studio 2017 vers la version 15.9 ou ultérieure.
Créer le projet DLL
Dans l’ensemble de tâches suivant, vous créez un projet pour votre DLL, ajoutez du code et générez-le. Pour commencer, démarrez l’IDE Visual Studio et connectez-vous si nécessaire. Les instructions varient légèrement selon la version de Visual Studio que vous utilisez. Pour afficher les étapes de votre version préférée de Visual Studio, utilisez le sélecteur de version situé en haut de la table des matières de cette page.
Pour créer un projet DLL dans Visual Studio
Dans la barre de menus, choisissez Fichier>Nouveau>Projet pour ouvrir la boîte de dialogue Créer un projet.
En haut de la boîte de dialogue, définissez Languesur C++, définissez Plateforme sur Windows et définissez le type de projet sur Bibliothèque.
Dans la liste filtrée des types de projets, sélectionnez Bibliothèque de liens dynamiques (DLL), puis choisissez Suivant.
Dans la page Configurer votre nouveau projet , entrez MathLibrary dans la zone Nom du projet pour spécifier un nom pour le projet. Conservez les valeurs de nom de l’emplacement et de la solution par défaut. Définissez la solution pour créer une solution. Désactivez la case à cocher Placer la solution et le projet dans le même répertoire s’il est activé.
Choisissez le bouton Créer pour créer le projet.
Une fois la solution créée, vous pouvez voir le projet généré et les fichiers sources dans la fenêtre Explorateur de solutions dans Visual Studio.
Pour créer un projet DLL dans Visual Studio 2017
Dans la barre de menus, choisissez Fichier>Nouveau>Projet pour ouvrir la boîte de dialogue Nouveau projet.
Dans le volet gauche de la boîte de dialogue Nouveau projet , sélectionnez Installé>Visual C++>Windows Desktop. Dans le volet central, sélectionnez Dynamic-Link Bibliothèque (DLL). Entrez MathLibrary dans la zone Nom pour spécifier un nom pour le projet. Conservez les valeurs de nom de l’emplacement et de la solution par défaut. Définissez la solution pour créer une solution. Cochez Créer un répertoire pour la solution si elle n'est pas cochée.
Choisissez le bouton OK pour créer le projet.
Une fois la solution créée, vous pouvez voir le projet généré et les fichiers sources dans la fenêtre Explorateur de solutions dans Visual Studio.
Pour créer un projet DLL dans Visual Studio 2015 et versions antérieures
Dans la barre de menus, choisissez Fichier>Nouveau>Projet.
Dans le volet gauche de la boîte de dialogue Nouveau projet, développezModèles>, puis sélectionnez Visual C++, puis, dans le volet central, sélectionnez Application console Win32. Entrez MathLibrary dans la zone d’édition Nom pour spécifier un nom pour le projet. Conservez les valeurs de nom de l’emplacement et de la solution par défaut. Définissez la solution pour créer une solution. Vérifiez le répertoire Créer une solution s’il n’est pas activé.
Choisissez le bouton OK pour ignorer la boîte de dialogue Nouveau projet et démarrer l’Assistant Application Win32.
Choisissez le bouton Suivant. Dans la page Paramètres de l’application , sous Type d’application, sélectionnez DLL.
Choisissez le bouton Terminer pour créer le projet.
Lorsque l’Assistant termine la solution, vous pouvez voir le projet généré et les fichiers sources dans la fenêtre Explorateur de solutions dans Visual Studio.
À l’heure actuelle, cette DLL ne fait pas grand-chose. Ensuite, vous allez créer un fichier d’en-tête pour déclarer les fonctions que vos DLL exporte, puis ajouter les définitions de fonction à la DLL pour le rendre plus utile.
Pour ajouter un fichier d’en-tête à la DLL
Pour créer un fichier d’en-tête pour vos fonctions, dans la barre de menus, choisissez Project>Add New Item.
Dans la boîte de dialogue Ajouter un nouvel élément , dans le volet gauche, sélectionnez Visual C++. Dans le volet central, sélectionnez Fichier d’en-tête (.h). Spécifiez
MathLibrary.hle nom du fichier d’en-tête.
Choisissez le bouton Ajouter pour générer un fichier d’en-tête vide, qui s’affiche dans une nouvelle fenêtre d’éditeur.
Remplacez le contenu du fichier d’en-tête par ce code :
// MathLibrary.h - Contains declarations of math functions #pragma once #ifdef MATHLIBRARY_EXPORTS #define MATHLIBRARY_API __declspec(dllexport) #else #define MATHLIBRARY_API __declspec(dllimport) #endif // The Fibonacci recurrence relation describes a sequence F // where F(n) is { n = 0, a // { n = 1, b // { n > 1, F(n-2) + F(n-1) // for some initial integral values a and b. // If the sequence is initialized F(0) = 1, F(1) = 1, // then this relation produces the well-known Fibonacci // sequence: 1, 1, 2, 3, 5, 8, 13, 21, 34, ... // Initialize a Fibonacci relation sequence // such that F(0) = a, F(1) = b. // This function must be called before any other function. extern "C" MATHLIBRARY_API void fibonacci_init( const unsigned long long a, const unsigned long long b); // Produce the next value in the sequence. // Returns true on success and updates current value and index; // false on overflow, leaves current value and index unchanged. extern "C" MATHLIBRARY_API bool fibonacci_next(); // Get the current value in the sequence. extern "C" MATHLIBRARY_API unsigned long long fibonacci_current(); // Get the position of the current value in the sequence. extern "C" MATHLIBRARY_API unsigned fibonacci_index();
Ce fichier d’en-tête déclare certaines fonctions pour produire une séquence Fibonacci généralisée, en fonction de deux valeurs initiales. Un appel à fibonacci_init(1, 1) génère la séquence bien connue des nombres de Fibonacci.
Notez les instructions de préprocesseur en haut du fichier. Le nouveau modèle de projet pour un projet DLL ajoute <PROJECTNAME>_EXPORTS aux macros de préprocesseur définies. Dans cet exemple, Visual Studio définit MATHLIBRARY_EXPORTS quand votre projet DLL MathLibrary est généré.
Lorsque la MATHLIBRARY_EXPORTS macro est définie, la MATHLIBRARY_API macro définit le __declspec(dllexport) modificateur sur les déclarations de fonction. Ce modificateur indique au compilateur et à l’éditeur de liens d’exporter une fonction ou une variable à partir de la DLL à utiliser par d’autres applications. Lorsqu’MATHLIBRARY_EXPORTS n’est pas défini, par exemple, lorsque le fichier d’en-tête est inclus par une application cliente, MATHLIBRARY_API applique le modificateur __declspec(dllimport) aux déclarations. Ce modificateur optimise l’importation de la fonction ou de la variable dans une application. Pour plus d’informations, consultez dllexport, dllimport.
Pour ajouter une implémentation à la DLL
Dans l’Explorateur de solutions, cliquez avec le bouton droit sur le nœud Fichiers sources et choisissez Ajouter>un nouvel élément. Créez un nouveau fichier
.cppappeléMathLibrary.cpp, comme vous avez ajouté un nouveau fichier d’en-tête à l’étape précédente.Dans la fenêtre de l’éditeur, sélectionnez l’onglet
MathLibrary.cpps’il est déjà ouvert. Si ce n’est pas le cas, dans l’Explorateur de solutions, double-cliquezMathLibrary.cppdans le dossier Fichiers sources du projet MathLibrary pour l’ouvrir.Dans l’éditeur, remplacez le contenu du
MathLibrary.cppfichier par le code suivant :// MathLibrary.cpp : Defines the exported functions for the DLL. #include "pch.h" // use stdafx.h in Visual Studio 2017 and earlier #include <utility> #include <limits.h> #include "MathLibrary.h" // DLL internal state variables: static unsigned long long previous_; // Previous value, if any static unsigned long long current_; // Current sequence value static unsigned index_; // Current seq. position // Initialize a Fibonacci relation sequence // such that F(0) = a, F(1) = b. // This function must be called before any other function. void fibonacci_init( const unsigned long long a, const unsigned long long b) { index_ = 0; current_ = a; previous_ = b; // see special case when initialized } // Produce the next value in the sequence. // Returns true on success, false on overflow. bool fibonacci_next() { // check to see if we'd overflow result or position if ((ULLONG_MAX - previous_ < current_) || (UINT_MAX == index_)) { return false; } // Special case when index == 0, just return b value if (index_ > 0) { // otherwise, calculate next sequence value previous_ += current_; } std::swap(current_, previous_); ++index_; return true; } // Get the current value in the sequence. unsigned long long fibonacci_current() { return current_; } // Get the current index position in the sequence. unsigned fibonacci_index() { return index_; }
Dans la fenêtre de l’éditeur, sélectionnez l’onglet pour MathLibrary.cpp s’il est déjà ouvert. Si ce n’est pas le cas, dans l’Explorateur de solutions, double-cliquez sur MathLibrary.cpp dans le dossier Fichiers sources du projet MathLibrary pour l’ouvrir.
Dans l’éditeur, remplacez le contenu du
MathLibrary.cppfichier par le code suivant :// MathLibrary.cpp : Defines the exported functions for the DLL. #include "stdafx.h" // use pch.h in Visual Studio 2019 and later #include <utility> #include <limits.h> #include "MathLibrary.h" // DLL internal state variables: static unsigned long long previous_; // Previous value, if any static unsigned long long current_; // Current sequence value static unsigned index_; // Current seq. position // Initialize a Fibonacci relation sequence // such that F(0) = a, F(1) = b. // This function must be called before any other function. void fibonacci_init( const unsigned long long a, const unsigned long long b) { index_ = 0; current_ = a; previous_ = b; // see special case when initialized } // Produce the next value in the sequence. // Returns true on success, false on overflow. bool fibonacci_next() { // check to see if we'd overflow result or position if ((ULLONG_MAX - previous_ < current_) || (UINT_MAX == index_)) { return false; } // Special case when index == 0, just return b value if (index_ > 0) { // otherwise, calculate next sequence value previous_ += current_; } std::swap(current_, previous_); ++index_; return true; } // Get the current value in the sequence. unsigned long long fibonacci_current() { return current_; } // Get the current index position in the sequence. unsigned fibonacci_index() { return index_; }
Pour vérifier que tout fonctionne jusqu’à présent, compilez la DLL. Pour compiler, choisissez Build>Solution dans la barre de menus. La DLL et la sortie du compilateur associée sont placées dans un dossier appelé Debug directement sous le dossier solution. Si vous créez une build Release, la sortie est placée dans un dossier appelé Release. Le résultat doit ressembler à ce qui suit :
1>------ Build started: Project: MathLibrary, Configuration: Debug Win32 ------
1>pch.cpp
1>dllmain.cpp
1>MathLibrary.cpp
1>Generating Code...
1> Creating library C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.lib and object C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.exp
1>MathLibrary.vcxproj -> C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.dll
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
1>------ Build started: Project: MathLibrary, Configuration: Debug Win32 ------
1>stdafx.cpp
1>dllmain.cpp
1>MathLibrary.cpp
1>Generating Code...
1> Creating library C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.lib and object C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.exp
1>MathLibrary.vcxproj -> C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.dll
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
1>------ Build started: Project: MathLibrary, Configuration: Debug Win32 ------
1>MathLibrary.cpp
1>dllmain.cpp
1>Generating Code...
1> Creating library C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.lib and object C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.exp
1>MathLibrary.vcxproj -> C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.dll
1>MathLibrary.vcxproj -> C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.pdb (Partial PDB)
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
Félicitations, vous avez créé une DLL à l’aide de Visual Studio ! Ensuite, vous allez créer une application cliente qui utilise les fonctions exportées par la DLL.
Créer une application cliente qui utilise la DLL
Lorsque vous créez une DLL, réfléchissez à la façon dont les applications clientes peuvent l’utiliser. Pour appeler les fonctions ou accéder aux données exportées par une DLL, le code source du client doit disposer des déclarations disponibles au moment de la compilation. Au moment du lien, l’éditeur de liens nécessite des informations pour résoudre les appels de fonction ou les accès aux données. Une DLL fournit ces informations dans une bibliothèque d’importation, un fichier qui contient des informations sur la façon de rechercher les fonctions et les données, au lieu du code réel. Et au moment de l’exécution, la DLL doit être disponible pour le client, à un emplacement où le système d’exploitation peut trouver.
Qu’il s’agisse de votre propre ou d’un tiers, votre projet d’application cliente a besoin de plusieurs informations pour utiliser une DLL. Il doit rechercher les en-têtes qui déclarent les exportations DLL, les bibliothèques d’importation pour l’éditeur de liens et la DLL elle-même. Une solution consiste à copier tous ces fichiers dans votre projet client. Pour les DLL tierces qui ne sont pas susceptibles de changer pendant le développement de votre client, cette méthode peut être la meilleure façon de les utiliser. Toutefois, lorsque vous générez également la DLL, il est préférable d’éviter la duplication. Si vous effectuez une copie locale de fichiers DLL en cours de développement, vous pouvez modifier accidentellement un fichier d’en-tête dans une copie, mais pas l’autre, ou utiliser une bibliothèque obsolète.
Pour éviter tout code hors synchronisation, nous vous recommandons de définir le chemin d’accès include dans votre projet client pour inclure les fichiers d’en-tête DLL directement à partir de votre projet DLL. Définissez également le chemin d’accès de la bibliothèque dans votre projet client pour inclure les bibliothèques d’importation DLL à partir du projet DLL. Enfin, copiez la DLL générée à partir du projet DLL dans votre répertoire de sortie de build client. Cette étape permet à votre application cliente d’utiliser le même code DLL que celui que vous générez.
Pour créer une application cliente dans Visual Studio
Dans la barre de menus, choisissez Fichier>nouveau>projet pour ouvrir la boîte de dialogue Créer un projet .
En haut de la boîte de dialogue, définissez Langage sur C++, Plateforme sur Windows et Type de projet sur Console.
À partir de la liste des types de projets, choisissez Application console, puis choisissez Suivant.
Dans la page Configurer votre nouveau projet , entrez MathClient dans la zone Nom du projet pour spécifier un nom pour le projet. Conservez les valeurs de nom de l’emplacement et de la solution par défaut. Définissez la solution pour créer une solution. Désactivez la case à cocher Placer la solution et le projet dans le même répertoire s’il est activé.
Choisissez le bouton Créer pour créer le projet client.
Un projet d’application console minimale est créé pour vous. Le nom du fichier source principal est identique au nom du projet que vous avez entré précédemment. Dans cet exemple, il est nommé MathClient.cpp. Vous pouvez le générer, mais il n’utilise pas encore votre DLL.
Pour créer une application cliente dans Visual Studio 2017
Pour créer une application C++ qui utilise la DLL que vous avez créée, dans la barre de menus, choisissez Fichier>nouveau>projet.
Dans le volet gauche de la boîte de dialogue Nouveau projet, sélectionnez Windows Desktop sousVisual C++>. Dans le volet central, sélectionnez Application console Windows. Spécifiez le nom du projet, MathClient, dans la zone d’édition Nom . Conservez les valeurs de nom de l’emplacement et de la solution par défaut. Définissez la solution pour créer une solution. Vérifiez le répertoire Créer une solution s’il n’est pas activé.
Choisissez OK pour créer le projet d’application cliente.
Un projet d’application console minimale est créé pour vous. Le nom du fichier source principal est identique au nom du projet que vous avez entré précédemment. Dans cet exemple, il est nommé MathClient.cpp. Vous pouvez le générer, mais il n’utilise pas encore votre DLL.
Pour créer une application cliente dans Visual Studio 2015
Pour créer une application C++ qui utilise la DLL que vous avez créée, dans la barre de menus, choisissez Fichier>nouveau>projet.
Dans le volet gauche de la boîte de dialogue Nouveau projet, sélectionnez Win32 sousModèles installés>>Visual C++. Dans le volet central, sélectionnez Application console Win32. Spécifiez le nom du projet, MathClient, dans la zone d’édition Nom . Conservez les valeurs de nom de l’emplacement et de la solution par défaut. Définissez la solution pour créer une solution. Vérifiez le répertoire Créer une solution s’il n’est pas activé.
Choisissez le bouton OK pour ignorer la boîte de dialogue Nouveau projet et démarrer l’Assistant Application Win32. Dans la page Vue d’ensemble de la boîte de dialogue Assistant Application Win32 , cliquez sur le bouton Suivant .
Dans la page Paramètres de l’application, sous Type d’application, sélectionnez l’application console si elle n’est pas déjà sélectionnée.
Choisissez le bouton Terminer pour créer le projet.
Une fois l’Assistant terminé, un projet d’application console minimal est créé pour vous. Le nom du fichier source principal est identique au nom du projet que vous avez entré précédemment. Dans cet exemple, il est nommé MathClient.cpp. Vous pouvez le générer, mais il n’utilise pas encore votre DLL.
Ensuite, pour appeler les fonctions MathLibrary dans votre code source, votre projet doit inclure le MathLibrary.h fichier. Vous pouvez copier ce fichier d’en-tête dans votre projet d’application cliente, puis l’ajouter au projet en tant qu’élément existant. Cette méthode peut être un bon choix pour les bibliothèques tierces. Toutefois, si vous travaillez sur le code de votre DLL et de votre client en même temps, les fichiers d’en-tête peuvent être désynchronisés. Pour éviter ce problème, définissez le chemin pour les répertoires d'inclusion supplémentaires dans votre projet pour inclure le chemin d’accès à l’en-tête d’origine.
Pour ajouter l’en-tête DLL à votre chemin d'inclusion
Cliquez avec le bouton droit sur le nœud MathClient dans l’Explorateur de solutions pour ouvrir la boîte de dialogue Pages de propriétés .
Dans la zone de liste déroulante Configuration , sélectionnez Toutes les configurations s’il n’est pas déjà sélectionné.
Dans le volet gauche, sélectionnez Propriétés> de configurationC/C++>Général.
Dans le volet de propriétés, sélectionnez la liste déroulante en regard de la zone d’édition Répertoires Include supplémentaires, puis choisissez Modifier.
Double-cliquez dans le volet supérieur de la boîte de dialogue Répertoires Include supplémentaires pour activer un contrôle d’édition. Vous pouvez également choisir l’icône de dossier pour créer une entrée.
Dans le contrôle d’édition, spécifiez le chemin d’accès à l’emplacement du
MathLibrary.hfichier d’en-tête. Vous pouvez choisir le bouton ellipse (...) pour naviguer vers le dossier correct.Vous pouvez également entrer un chemin relatif de vos fichiers sources clients vers le dossier qui contient les fichiers d’en-tête DLL. Si vous avez suivi les instructions pour placer votre projet client dans une solution distincte de la DLL, le chemin relatif doit ressembler à ceci :
..\..\MathLibrary\MathLibrarySi vos projets DLL et clients se trouvent dans la même solution, le chemin d’accès relatif peut ressembler à ceci :
..\MathLibraryLorsque les projets DLL et clients se trouvent dans d’autres dossiers, ajustez le chemin d’accès relatif pour qu'il corresponde. Ou, utilisez le contrôle des points de suspension pour parcourir le dossier.
Une fois que vous avez entré le chemin d’accès au fichier d’en-tête dans la boîte de dialogue Répertoires Include supplémentaires , choisissez le bouton OK . Dans la boîte de dialogue Pages de propriétés , choisissez le bouton OK pour enregistrer vos modifications.
Vous pouvez désormais inclure le MathLibrary.h fichier et utiliser les fonctions qu’il déclare dans votre application cliente. Remplacez le contenu de MathClient.cpp en utilisant ce code :
// MathClient.cpp : Client app for MathLibrary DLL.
// #include "pch.h" Uncomment for Visual Studio 2017 and earlier
#include <iostream>
#include "MathLibrary.h"
int main()
{
// Initialize a Fibonacci relation sequence.
fibonacci_init(1, 1);
// Write out the sequence values until overflow.
do {
std::cout << fibonacci_index() << ": "
<< fibonacci_current() << std::endl;
} while (fibonacci_next());
// Report count of values written before overflow.
std::cout << fibonacci_index() + 1 <<
" Fibonacci sequence values fit in an " <<
"unsigned 64-bit integer." << std::endl;
}
Ce code peut être compilé, mais pas lié. Si vous générez l’application cliente maintenant, la liste des erreurs affiche plusieurs erreurs LNK2019. Cela est dû au fait que votre projet ne contient pas encore d’informations : vous n’avez pas encore spécifié que votre projet est dépendant de la MathLibrary.lib bibliothèque. Et vous n’avez pas dit à l’éditeur de liens comment trouver le MathLibrary.lib fichier.
Pour résoudre ce problème, vous pouvez copier le fichier de bibliothèque directement dans votre projet d’application cliente. L’éditeur de liens trouve et l’utilise automatiquement. Toutefois, si la bibliothèque et l’application cliente sont en cours de développement, cela peut entraîner des modifications dans une copie qui ne sont pas affichées dans l’autre. Pour éviter ce problème, vous pouvez définir la propriété Dépendances supplémentaires pour indiquer au système de génération dont dépend MathLibrary.libvotre projet. Vous pouvez également définir un chemin d’accès supplémentaire aux répertoires de bibliothèque dans votre projet pour inclure le chemin d’accès à la bibliothèque d’origine lorsque vous liez.
Pour ajouter la bibliothèque d’importation DLL à votre projet
Cliquez avec le bouton droit sur le nœud MathClient dans l’Explorateur de solutions et choisissez Propriétés pour ouvrir la boîte de dialogue Pages de propriétés .
Dans la zone de liste déroulante Configuration , sélectionnez Toutes les configurations s’il n’est pas déjà sélectionné. Elle garantit que toutes les modifications de propriété s’appliquent aux builds Debug et Release.
Dans le volet gauche, sélectionnez Propriétés de configuration>Éditeur de liens>Entrée. Dans le volet de propriétés, sélectionnez le contrôle déroulant en regard de la zone d’édition Dépendances supplémentaires , puis choisissez Modifier.
Dans la boîte de dialogue Dépendances supplémentaires, ajoutez
MathLibrary.libà la liste dans le contrôle d’édition supérieur.
Choisissez OK pour revenir à la boîte de dialogue Pages de propriétés .
Dans le volet gauche, sélectionnez Propriétés de configuration>Linker>Général. Dans le volet de propriétés, sélectionnez le contrôle déroulant en regard de la zone d’édition Répertoires de bibliothèques supplémentaires , puis choisissez Modifier.
Double-cliquez dans le volet supérieur de la boîte de dialogue Répertoires de bibliothèques supplémentaires pour activer un contrôle d’édition. Dans le contrôle d’édition, spécifiez le chemin d’accès à l’emplacement du
MathLibrary.libfichier. Par défaut, il se trouve dans un dossier appelé Déboguer directement sous le dossier de solution DLL. Si vous créez une build de mise en production, le fichier est placé dans un dossier appelé Release. Vous pouvez utiliser la$(IntDir)macro pour que l’éditeur de liens puisse trouver votre DLL, quel que soit le type de build que vous créez. Si vous avez suivi les instructions pour placer votre projet client dans une solution distincte du projet DLL, le chemin relatif doit ressembler à ceci :..\..\MathLibrary\$(IntDir)Si vos projets DLL et clients se trouvent dans d’autres emplacements, ajustez le chemin relatif pour correspondre.
Une fois que vous avez entré le chemin d’accès au fichier de bibliothèque dans la boîte de dialogue Répertoires de bibliothèques supplémentaires , choisissez le bouton OK pour revenir à la boîte de dialogue Pages de propriétés. Choisissez OK pour enregistrer les modifications de propriété.
Votre application cliente peut maintenant compiler et lier correctement, mais elle n’a toujours pas tout ce dont elle a besoin pour s’exécuter. Lorsque le système d’exploitation charge votre application, il recherche la DLL MathLibrary. S’il ne trouve pas la DLL dans certains répertoires système, le chemin d’environnement ou le répertoire d’application local, la charge échoue. Selon le système d’exploitation, un message d’erreur semblable à celui-ci s’affiche :
Une façon d’éviter ce problème consiste à copier la DLL dans le répertoire qui contient votre exécutable client dans le cadre du processus de génération. Vous pouvez ajouter un événement post-build à votre projet pour ajouter une commande qui copie la DLL dans votre répertoire de sortie de build. La commande spécifiée ici copie la DLL uniquement si elle est manquante ou a changé. Il utilise des macros pour copier vers et à partir des emplacements de débogage ou de mise en production, en fonction de votre configuration de build.
Pour copier la DLL dans un événement post-build
Cliquez avec le bouton droit sur le nœud MathClient dans l’Explorateur de solutions et choisissez Propriétés pour ouvrir la boîte de dialogue Pages de propriétés .
Dans la zone de liste déroulante Configuration , sélectionnez Toutes les configurations s’il n’est pas déjà sélectionné.
Dans le volet gauche, sélectionnez Propriétés de la configuration>Événements de génération>Événement post-génération.
Dans le volet de propriétés, sélectionnez le contrôle d’édition dans le champ Ligne de commande . Si vous avez suivi les instructions pour placer votre projet client dans une solution distincte du projet DLL, entrez cette commande :
xcopy /y /d "..\..\MathLibrary\$(IntDir)MathLibrary.dll" "$(OutDir)"Si vos projets DLL et clients se trouvent dans d’autres répertoires, modifiez le chemin relatif de la DLL pour qu’il corresponde.
Choisissez le bouton OK pour enregistrer vos modifications dans les propriétés du projet.
À présent, votre application cliente a tout ce dont elle a besoin pour générer et exécuter. Générez l’application en choisissant Build>Solution dans la barre de menus. La fenêtre Sortie dans Visual Studio doit avoir quelque chose comme l’exemple suivant en fonction de votre version de Visual Studio :
1>------ Build started: Project: MathClient, Configuration: Debug Win32 ------
1>MathClient.cpp
1>MathClient.vcxproj -> C:\Users\username\Source\Repos\MathClient\Debug\MathClient.exe
1>1 File(s) copied
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
Félicitations, vous avez créé une application qui appelle des fonctions dans votre DLL. Exécutez maintenant votre application pour voir ce qu’elle fait. Dans la barre de menus, choisissez Déboguer>Démarrer sans débogage. Visual Studio ouvre une fenêtre de commande pour que le programme s’exécute. La dernière partie de la sortie doit ressembler à ceci :
Appuyez sur n’importe quelle touche pour ignorer la fenêtre de commande.
Maintenant que vous avez créé une DLL et une application cliente, vous pouvez expérimenter. Essayez de définir des points d’arrêt dans le code de l’application cliente, puis exécutez l’application dans le débogueur. Découvrez ce qui se passe quand vous passez à un appel de bibliothèque. Ajoutez d’autres fonctions à la bibliothèque ou écrivez une autre application cliente qui utilise votre DLL.
Lorsque vous déployez votre application, vous devez également déployer les DLL qu’elle utilise. La façon la plus simple de rendre les DLL que vous générez, ou que vous incluez à partir de tiers, est de les placer dans le même répertoire que votre application. Il s’agit d’un déploiement local d’application. Pour plus d’informations sur le déploiement, consultez Déploiement dans Microsoft C++.