Création de DLL C/C++ dans Visual Studio

Dans Windows, une bibliothèque de liens dynamiques (DLL) est un type de fichier exécutable qui agit comme une bibliothèque partagée de fonctions et de ressources. La liaison dynamique est une fonctionnalité de système d’exploitation. Il permet à un exécutable d’appeler des fonctions ou d’utiliser des ressources stockées dans un fichier distinct. Ces fonctions et ressources peuvent être compilées et déployées séparément des exécutables qui les utilisent.

Une DLL n’est pas un exécutable autonome. Les DLL s’exécutent dans le contexte des applications qui les appellent. Le système d’exploitation charge la DLL dans l’espace mémoire d’une application. Cela se fait lorsque l’application est chargée (liaison implicite) ou à la demande au moment de l’exécution (liaison explicite). Les DLL facilitent également le partage des fonctions et des ressources entre les fichiers exécutables. Plusieurs applications peuvent accéder simultanément au contenu d'une copie de la DLL en mémoire.

Différences entre la liaison dynamique et la liaison statique

La liaison statique copie tout le code objet d’une bibliothèque statique dans les exécutables qui l’utilisent lorsqu’ils sont générés. La liaison dynamique inclut uniquement les informations requises par Windows au moment de l’exécution pour localiser et charger la DLL qui contient un élément de données ou une fonction. Lorsque vous créez une DLL, vous créez également une bibliothèque d’importation qui contient ces informations. Lorsque vous générez un exécutable qui appelle la DLL, l’éditeur de liens utilise les symboles exportés dans la bibliothèque d’importation pour stocker ces informations pour le chargeur Windows. Lorsque le chargeur charge une DLL, la DLL est mappée dans l’espace mémoire de votre application. Si elle est présente, une fonction spéciale dans la DLL est DllMainappelée pour effectuer une initialisation requise par la DLL.

Différences entre les applications et les DLL

Même si les DLL et les applications sont des modules exécutables, ils diffèrent de plusieurs façons. La différence la plus évidente est que vous ne pouvez pas exécuter une DLL. Du point de vue du système, il existe deux différences fondamentales entre les applications et les DLL :

  • Une application peut avoir plusieurs instances d’elle-même s’exécutant simultanément dans le système. Une DLL ne peut avoir qu’une seule instance.

  • Une application peut être chargée en tant que processus. Il peut posséder des éléments tels qu’une pile, des threads d’exécution, de la mémoire globale, des handles de fichiers et une file d’attente de messages. Une DLL ne peut pas posséder ces éléments.

Avantages de l’utilisation de DLL

La liaison dynamique au code et aux ressources offre plusieurs avantages par rapport à la liaison statique :

  • La liaison dynamique enregistre la mémoire et réduit l’échange. De nombreux processus peuvent utiliser simultanément une DLL, partageant une seule copie des parties en lecture seule d’une DLL en mémoire. En revanche, chaque application générée à l’aide d’une bibliothèque liée statiquement a une copie complète du code de bibliothèque que Windows doit charger en mémoire.

  • La liaison dynamique permet d’économiser de l’espace disque et de la bande passante. De nombreuses applications peuvent partager une seule copie de la DLL sur le disque. En revanche, chaque application créée à l’aide d’une bibliothèque de liens statiques a le code de la bibliothèque lié à son image exécutable. Cela utilise davantage d’espace disque et prend plus de bande passante à transférer.

  • La maintenance, les correctifs de sécurité et les mises à niveau peuvent être plus faciles. Lorsque vos applications utilisent des fonctions courantes dans une DLL, vous pouvez implémenter des correctifs de bogues et déployer des mises à jour dans la DLL. Lorsque des DLL sont mises à jour, les applications qui les utilisent n’ont pas besoin d’être recompilées ou relinkées. Ils peuvent utiliser la nouvelle DLL dès son déploiement. En revanche, lorsque vous apportez des correctifs dans le code objet lié statiquement, vous devez relinker et redéployer chaque application qui l’utilise.

  • Vous pouvez utiliser des DLL pour fournir une prise en charge après le marché. Par exemple, une DLL de pilote d’affichage peut être modifiée pour prendre en charge un affichage qui n’était pas disponible lorsque l’application a été livrée.

  • Vous pouvez utiliser la liaison explicite pour découvrir et charger des DLL au moment de l’exécution. Par exemple, les extensions d’application qui ajoutent de nouvelles fonctionnalités à votre application sans la reconstruire ou la redéployer.

  • La liaison dynamique facilite la prise en charge des applications écrites dans différents langages de programmation. Les programmes écrits dans différents langages de programmation peuvent appeler la même fonction DLL tant que les programmes suivent la convention d’appel de la fonction. Les programmes et la fonction DLL doivent être compatibles de la manière suivante : l’ordre dans lequel la fonction s’attend à ce que ses arguments soient envoyés sur la pile. Indique si la fonction ou l’application est chargée de propre monter la pile. Et si des arguments sont passés dans des registres.

  • La liaison dynamique fournit un mécanisme permettant d’étendre les classes MFC (Microsoft Foundation Class Library). Vous pouvez dériver des classes MFC existantes et les placer dans une DLL d’extension MFC à utiliser par les applications MFC.

  • La liaison dynamique facilite la création de versions internationales de votre application. Les DLL sont un moyen pratique de fournir des ressources spécifiques aux paramètres régionaux, ce qui facilite considérablement la création de versions internationales d’une application. Au lieu d’envoyer de nombreuses versions localisées de votre application, vous pouvez placer les chaînes et les images pour chaque langue dans une DLL de ressource distincte. Votre application peut ensuite charger les ressources appropriées pour ces paramètres régionaux au moment de l’exécution.

Un inconvénient potentiel à l’utilisation de DLL est que l’application n’est pas autonome. Cela dépend de l’existence d’un module DLL distinct : celui que vous devez déployer ou vérifier vous-même dans le cadre de votre installation.

Plus d’informations sur la création et l’utilisation de DLL

Les articles suivants fournissent des informations détaillées sur la création de DLL C/C++ dans Visual Studio.

Procédure pas à pas : Création et utilisation d’une bibliothèque de liens dynamiques (C++)
Montre comment créer et utiliser une DLL à l'aide de Visual Studio.

Genres de DLL
Fournit des informations sur les différentes sortes de DLL qui peuvent être générées.

Forum aux questions sur la DLL
Fournit des réponses à des questions fréquentes concernant les DLL.

Lier un exécutable à une DLL
Décrit la liaison explicite et implicite à une DLL.

Initialiser une DLL
Décrit le code d’initialisation dll qui doit s’exécuter lorsque votre DLL se charge.

DLL et comportement de la bibliothèque runtime Visual C++
Décrit la séquence de démarrage de la DLL de bibliothèque d’exécution.

LoadLibrary et AfxLoadLibrary
Discute de l’utilisation LoadLibrary et AfxLoadLibrary du lien explicite vers une DLL au moment de l’exécution.

GetProcAddress
Décrit l’utilisation GetProcAddress pour obtenir l’adresse d’une fonction exportée dans la DLL.

FreeLibrary et AfxFreeLibrary
Discute de l’utilisation FreeLibrary et AfxFreeLibrary du moment où le module DLL n’est plus nécessaire.

Ordre de recherche de bibliothèque de liens dynamiques
Décrit le chemin d’accès que le système d’exploitation Windows utilise pour rechercher une DLL sur le système.

États de module d’une DLL MFC standard liée dynamiquement à MFC
Décrit les états de module d’une DLL MFC standard liée dynamiquement à MFC.

DLL d’extension de MFC
Explique les DLL qui implémentent généralement des classes réutilisables dérivées des classes MFC existantes.

Création d’une DLL de ressource uniquement
Traite des DLL de ressource uniquement, qui ne contiennent que des ressources, telles que des icônes, des images bitmap, des chaînes et des boîtes de dialogue.

Ressources localisées dans les applications MFC : DLL satellites
Fournit une prise en charge améliorée pour les DLL satellites, une fonctionnalité qui vous aide à créer des applications localisées pour différentes langues.

Importation et exportation
Décrit l'importation de symboles publics dans une application ou l'exportation de fonctions à partir d'une DLL.

Technologies actives et DLL
Autorise l'implémentation des serveurs d'objets dans une DLL.

Automation dans une DLL
Décrit ce que fournit l'option Automation de l'Assistant DLL MFC.

Conventions d’affectation de noms pour les DLL MFC
Décrit comment les DLL et les bibliothèques incluses dans les MFC obéissent aux règles d'une convention d'attribution de noms structurée.

Appel de fonctions DLL à partir d’applications Visual Basic
Explique comment appeler des fonctions DLL à partir d'applications Visual Basic.

Utilisation de MFC dans le cadre d’une DLL
Décrit les DLL MFC standard, qui vous permettent d’utiliser la bibliothèque MFC dans le cadre d’une bibliothèque de liens dynamiques Windows.

Version DLL de MFC
Décrit comment utiliser MFCxx.dll et MFCxxD.dll (où x est le numéro de version MFC) des bibliothèques de liens dynamiques partagés avec des applications MFC et des DLL d’extension MFC.