Nous allons voir cet article la création d’un projet C++ avec Visual Studio divisé en plusieurs DLL (Dynamic Link Library).
Une DLL c’est quoi ?
Définition Wikipédia :
.dll est une extension de nom de fichier utilisée par des fichiers contenant une Dynamic Link Library. Ces bibliothèques logicielles existent dans Windows depuis 1985. Les fonctions sont chargées en mémoire par un programme, au besoin, lors de son exécution.
C’est bien mais … pourquoi se compliquer la vie avec une DLL ?
En voilà une très bonne question ! L’avantage premier est la modularité, votre programme peut être mis à jour très simplement. En replaçant juste une DLL une grande partie de votre application peut être réécrite si celle-ci est bien conçue. Mon exemple le plus flagrant se trouve dans la réalisation d’un moteur de jeu. Si le module de votre moteur graphique 3D est une DLL dans ce cas si vous souhaitez ajouté le support de Vulkan/OpenGL voir d’une version supérieure de Direct3D par exemple, alors il vous suffira de travailler sur une nouvelle DLL, sans modifier une seule ligne de code dans le moteur en lui-même. Ceci vous permet donc d’avoir un moteur évolutif et rapidement améliorable.
Création de notre DLL
Création du projet sur Visual Studio
Nous allons devoir créer un projet du type “Win32 console Application”. J’utilise personnellement Visual Studio Community en anglais, par conséquent la démarche que je vais vous décrire le sera de même. Cependant, la manipulation est la même, il suffit en général de traduire bêtement mot par mot.
Sur la page d’accueil de Visual Studio :
- “New Project”
- Une nouvelle fenêtre fait son apparition, sélectionner “Visual C++” puis “Win32”.
- Choisissez “Win32 Project”. Ajouté un nom ainsi que la localisation de votre projet puis appuyer sur “ok”.
Je vous conseille de configurer votre projet comme sur l’image ci-dessous :
La DLL
Notre projet est maintenant créé mais il est complètement vide, nous allons remédier à cela avec la création de notre main, c’est-à-dire du point d’entrée de notre programme. Pour cela rien de bien compliquer, clique droit sur Source Files -> Add -> New Item -> nommé le main.cpp.
Vous retrouverez ici le code de main.cpp :
#include <iostream>
#include "../MyDLL/MyDLL.h"
using namespace std;
int main()
{
cout << "Start app" << endl;
MyDLL dll;
dll.sayHello();
//Stop program for Visual Studio
int exit = 0;
cin >> exit;
return 0;
}
Maintenant nous allons attaquer notre DLL. Dans l’explorateur de solution, clique droit sur votre solution -> Add -> New Project -> Win32 Console Application, que je nommerais MyDLL -> Configurer le projet comme sur l’image ci-dessous, en cochant bien DLL.
Vous devriez voir apparaître dans l’explorateur de solution un nouveau projet. Avant d’attaquer le code, il nous faut rajouté notre DLL en référence à notre projet principal. Pour ce faire c’est très simple. Dans l’explorateur de solution, faite un clique droit sur references -> Add reference -> Cocher la case devant le nom de projet de votre DLL.
Nous allons maintenant ajouter une classe du nom de MyDLL, du même nom que ma DLL, mais sachez que cela n’est absolument pas obligatoire.
Vous retrouverez ici le code de MyDLL.h :
#pragma once
#ifndef MYDLL_H_INCLUDED
#define MYDLL_H_INCLUDED
/////////////////////////////INCLUDE/////////////////////////
#include <iostream>
/////////////////////////////////////////////////////////////
class __declspec(dllexport) MyDLL
{
public:
MyDLL();
virtual ~MyDLL();
void sayHello();
};
#endif
Rien d’extraordinaire ici sauf une petite subtilité, vous avez sûrement remarqué que nous avons un nouvel arrivant dans la déclaration de notre classe __declspec(dll export)
. Ne l’oubliez surtout pas, ceci est indispensable sinon il sera inaccessible en dehors de la DLL elle-même. Ceci est une indication pour le compilateur.
Vous retrouverez ici le code de MyDLL.cpp :
/////////////////////////////INCLUDE/////////////////////////
#include "MyDLL.h"
/////////////////////////////////////////////////////////////
using namespace std;
/*
** Class MyDLL
*/
//Public
MyDLL::MyDLL()
{ }
MyDLL::~MyDLL()
{ }
void MyDLL::sayHello()
{
cout << "Hello ! I am the DLL :)" << endl;
}
Maintenant votre projet devrait ressembler à l’image qui suit. Voilà votre premier projet avec une DLL dynamique, n’oubliez pas que celle-ci peut être très utile pour un programme qui demande d’être flexible et modulaire.
Je vais juste faire une petite parenthèse ici, malheureusement vous ne pourrez pas utiliser de template dans vos DLL. Ils ne sont pas supportés pour le moment par Visual studio. Ceci est un sacrifice nécessaire d’après moi face aux possibilités qu’apporte une DLL.
Merci d’avoir suivi cet article ! Je rappelle que le code source ainsi que l’article en lui-même est libre de droits, selon les indications ci-dessous.
Téléchargement du projet Visual Studio Community
Téléchargement du code source (sans projet)