- Article
- 15 minutes de lecture
Cet article explique ce qu'est une DLL (Dynamic Link Library) et les problèmes qui peuvent survenir lors de l'utilisation de DLL. Il aborde également certains problèmes avancés à prendre en compte lors du développement de vos propres DLL.
Applicabilité :Windows 10 - Toutes les éditions
Numéro d'article d'origine dans la base de connaissances :815065
Continuer
Pour décrire une DLL, cet article explique les méthodes de liaison dynamique, les dépendances DLL, les points d'entrée DLL, l'exportation des fonctions DLL et les outils de dépannage DLL.
Cet article se termine par une comparaison approfondie entre les DLL et les assemblys Microsoft .NET Framework.
Sur les systèmes d'exploitation Windows, la plupart des fonctions du système d'exploitation sont fournies par des DLL. Même si vous exécutez un programme sur l'un de ces systèmes d'exploitation Windows, la plupart des fonctionnalités du programme peuvent être fournies par des DLL. Par exemple, certains programmes peuvent contenir de nombreux modules différents, chaque module du programme est alors contenu et distribué dans des DLL.
L'utilisation de DLL aide à promouvoir la modularisation du code, la réutilisation du code, l'utilisation efficace de la mémoire et la réduction de l'utilisation de la mémoire. Par conséquent, le système d'exploitation et les programmes se chargent et s'exécutent plus rapidement et occupent moins de mémoire sur l'ordinateur.
Lorsqu'un programme utilise une DLL, un problème appelé "dépendance" peut empêcher le programme de s'exécuter. Lorsqu'un programme utilise une DLL, une dépendance est créée. Si un autre programme remplace et rompt cette dépendance, le programme d'origine ne peut pas fonctionner correctement.
Avec la sortie du .NETFramework, la plupart des problèmes de dépendance d'assembly ont été éliminés.
Plus d'informations
Une DLL est une bibliothèque qui contient du code et des données qui peuvent être utilisées par plusieurs programmes en même temps. Par exemple, dans les systèmes d'exploitation Windows, la DLL Comdlg32 exécute des fonctions liées aux boîtes de dialogue courantes. Tout programme peut utiliser la fonctionnalité contenue dans cette DLL pour implémenter une boîte de dialogueOuvrir. Cela favorise la réutilisation du code et l'utilisation efficace de la mémoire.
En utilisant une DLL, un programme peut être organisé en plusieurs modules dans des composants séparés. Par exemple, un programme de comptabilité peut être vendu en modules. N'importe quel module peut être chargé dans le programme principal lors de l'exécution si ce module est installé. Comme les modules sont séparés, le temps de chargement du programme est réduit. De plus, un module n'est chargé que lorsque cette fonctionnalité est demandée.
De plus, les mises à jour sont plus faciles à appliquer à chaque module sans affecter les autres parties du programme. Par exemple, vous pouvez avoir un programme de paie et les taux d'imposition changent chaque année. Avec ces modifications isolées dans une DLL, vous pouvez appliquer une mise à jour sans avoir à reconstruire ou à réinstaller l'intégralité du programme.
La liste suivante décrit certains des fichiers implémentés en tant que DLL dans les systèmes d'exploitation Windows :
Fichiers de contrôle ActiveX (.ocx)
Un exemple de contrôle ActiveX est un contrôle de calendrier que vous pouvez utiliser pour sélectionner une date dans un calendrier.
Fichiers de panneaux (.cpl)
Un fichier .cpl peut être un élément situé dans le Panneau de configuration. Chaque élément est une DLL spécialisée.
Fichiers de pilote de périphérique (.drv)
Par exemple, un pilote de périphérique est un pilote d'imprimante qui contrôle l'impression sur une imprimante.
Avantages des DLL
La liste suivante décrit certains des avantages offerts lorsqu'un programme utilise une DLL :
Le programme utilise moins de ressources
Lorsque plusieurs programmes utilisent la même bibliothèque de fonctions, une DLL peut réduire la duplication du code chargé sur le disque et dans la mémoire physique. Cela peut affecter considérablement les performances non seulement du programme exécuté au premier plan, mais également d'autres programmes exécutés sur le système d'exploitation Windows.
Une DLL favorise une architecture modulaire
Une DLL encourage le développement de programmes modulaires. Cela vous permet de développer de gros programmes qui nécessitent plusieurs versions linguistiques, ou un programme qui nécessite une architecture modulaire. Un exemple de programme modulaire est un programme de comptabilité avec de nombreux modules qui peuvent être chargés dynamiquement lors de l'exécution.
Une DLL facilite le déploiement et l'installation
Si une fonctionnalité d'une DLL nécessite une mise à jour ou un correctif, le déploiement et l'installation de la DLL ne nécessitent pas de recréer le lien entre le programme et la DLL. Même si plusieurs programmes utilisent la même DLL, ces programmes bénéficieront tous de la mise à jour ou du correctif. Ce problème peut se produire plus fréquemment si vous utilisez une DLL tierce régulièrement mise à jour ou corrigée.
Dépendances DLL
Lorsqu'un programme ou une DLL utilise une fonction DLL dans une autre DLL, une dépendance est créée. Le programme n'est plus indépendant et des problèmes peuvent survenir si la dépendance est rompue. Par exemple, le programme ne s'exécute pas dans l'une des situations suivantes :
- Une DLL dépendante est mise à jour vers une nouvelle version.
- Une DLL dépendante est fixée.
- Une DLL dépendante est remplacée par une version précédente.
- Une DLL dépendante est supprimée de l'ordinateur.
Ces situations sont appelées "conflits DLL". Si la rétrocompatibilité n'est pas garantie, le programme peut ne pas s'exécuter correctement.
La liste suivante décrit les modifications introduites dans Windows 2000 et les systèmes d'exploitation Windows ultérieurs pour réduire les problèmes de dépendance :
Protection des fichiers Windows
Dans la fonction de protection des fichiers Windows, le système d'exploitation empêche la mise à jour ou la suppression des DLL système par un agent non autorisé. Lorsqu'un programme d'installation tente de supprimer ou de mettre à jour une DLL définie en tant que DLL système, la protection des fichiers Windows recherche une signature numérique valide.
DLL privées
Les DLL privées vous permettent d'isoler un programme des modifications apportées aux DLL partagées. Les DLL privées utilisent des informations spécifiques à la version ou un fichier
.local
vide pour appliquer la version de la DLL utilisée par le programme. Pour utiliser des DLL privées, localisez vos DLL dans le dossier racine du programme. Ajoutez ensuite des informations spécifiques à la version à la DLL pour les nouveaux programmes. Pour les programmes plus anciens, utilisez un fichier.local
vide. Chaque méthode demande au système d'exploitation d'utiliser des DLL privées situées dans le dossier racine du programme.
Il existe plusieurs outils disponibles pour résoudre les problèmes de DLL. Voici quelques-uns de ces outils :
marcheur de dépendance
L'outil Dependency Walker vous permet d'effectuer une analyse récursive de toutes les DLL dépendantes utilisées par un programme. Lorsque vous ouvrez un programme dans Dependency Walker, il effectue les vérifications suivantes :
- Dependency Walker recherche les DLL manquantes.
- Il recherche les fichiers de programme ou les DLL non valides.
- Il vérifie si les fonctions d'importation et les fonctions d'exportation correspondent.
- Il vérifie les erreurs de dépendance circulaire.
- Il recherche les modules qui ne sont pas valides car ils appartiennent à un autre système d'exploitation.
Dependency Walker vous permet de documenter toutes les DLL utilisées par un programme. Cela peut aider à prévenir et à résoudre les problèmes de DLL qui pourraient apparaître à l'avenir. Dependency Walker se trouve dans le répertoire suivant lorsque vous installez Visual Studio 6.0 :
Laufwerk\Programme\Microsoft Visual Studio\Common\Tools
Résolveur de problèmes universel DLL
L'outil DLL Universal Problem Solver (DUPS) est utilisé pour examiner, comparer, documenter et afficher des informations sur les DLL. La liste suivante décrit les utilitaires inclus dans l'outil DUPS :
Dlister.exe
Cet utilitaire répertorie toutes les DLL de l'ordinateur et enregistre ces informations dans un fichier texte ou un fichier de base de données.
dcomp.exe
(Video) ERREUR : Point d'entrée introuvable Bibliothèque de liens dynamiques Windows 11 FixCet utilitaire compare les DLL répertoriées dans deux fichiers texte et génère un troisième fichier texte indiquant les différences.
Dtxt2DB.exe
Cet utilitaire charge les fichiers texte créés par les utilitaires Dlister.exe et Dcomp.exe dans la base de données dllHell.
DlgDtxt2DB.exe
Cet utilitaire fournit une version GUI (interface utilisateur graphique) de l'utilitaire Dtxt2DB.exe.
Base de données d'aide DLL
La base de données d'aide DLL vous aide à localiser les versions spécifiques des DLL installées par les logiciels Microsoft.
Développement de DLL
Cette section décrit les problèmes et les exigences à prendre en compte lors du développement de vos propres DLL.
Types de DLL
Lorsque vous chargez une DLL dans une application, vous pouvez appeler les fonctions DLL exportées à l'aide de deux méthodes de liaison : la liaison dynamique au moment du chargement et la liaison dynamique à l'exécution.
Liaison dynamique au moment du chargement
Avec la liaison dynamique au moment du chargement, une application appelle explicitement les fonctions DLL qui ont été exportées en tant que fonctions locales. Pour utiliser la liaison dynamique au moment du chargement, fournissez un fichier d'en-tête (.h) et un fichier de bibliothèque d'importation (.lib) lors de la compilation et de la liaison de l'application. Au cours de ce processus, l'éditeur de liens fournit au système les informations dont il a besoin pour charger la DLL et définir les emplacements des fonctions DLL exportées au moment du chargement.
Liaison dynamique à l'exécution
Avec la liaison dynamique d'exécution, une application appelle la fonctionCharger la bibliothèque
ouLoadLibraryEx
pour charger la DLL au moment de l'exécution. Une fois la DLL chargée, utilisez la fonctionGetProcAddress
pour obtenir l'adresse de la fonction DLL exportée que vous souhaitez appeler. Si vous utilisez la liaison dynamique d'exécution, vous n'avez pas besoin d'un fichier de bibliothèque d'importation.
La liste suivante décrit les critères d'application pour savoir quand utiliser la liaison dynamique au moment du chargement et quand utiliser la liaison dynamique au moment de l'exécution :
puissance de démarrage
Si les performances au premier lancement de l'application sont importantes, envisagez d'utiliser la liaison dynamique d'exécution.
convivialité
Avec la liaison dynamique au moment du chargement, les fonctions DLL exportées sont similaires aux fonctions locales. Cela facilite l'appel de ces fonctions.
logique d'application
La liaison dynamique au moment de l'exécution permet à une application de charger des modules spécifiques selon les besoins. Ceci est important lors du développement de versions multilingues.
Point d'entrée DLL
Lorsque vous créez une DLL, vous pouvez éventuellement spécifier une fonction de point d'entrée. La fonction de point d'entrée est appelée lorsque des processus ou des threads s'attachent ou se détachent de la DLL. Vous pouvez utiliser la fonction de point d'entrée pour initialiser des structures de données ou pour détruire des structures de données selon les besoins de la DLL. Si l'application est multithread, vous pouvez utiliser Thread Local Storage (TLS) dans la fonction de point d'entrée pour allouer de la mémoire privée à chaque thread. Le code suivant est un exemple de fonction de point d'entrée DLL.
BOOL APIENTRY DllMain(HANDLE hModule,// Handle to DLL moduleDWORD ul_reason_for_call,// Reason for call functionLPVOID lpReserved ) // Réservé{ switch ( ul_reason_for_call ) { case DLL_PROCESS_ATTACHED : // Un processus charge la DLL. casser; case DLL_THREAD_ATTACHED : // Un processus crée un nouveau thread. casser; case DLL_THREAD_DETACH : // Un thread se termine normalement. casser; case DLL_PROCESS_DETACH : // Un processus décharge la DLL. casser; } renvoie VRAI ; }
Si la fonction de point d'entrée renvoie une valeur FALSE, l'application ne démarrera pas si vous utilisez des liens dynamiques au moment du chargement. Si vous utilisez la liaison dynamique au moment de l'exécution, seule la DLL unique n'est pas chargée.
La fonction de point d'entrée ne doit effectuer que des tâches d'initialisation simples et ne doit appeler aucune autre fonction de chargement ou d'arrêt de DLL. Par exemple, dans la fonction de point d'entrée, vous ne devez pas appeler la fonction directement ou indirectementCharger la bibliothèque
ouLoadLibraryEx
. Aussi, vous ne devriez pas appeler la fonctionBibliothèque gratuite
lorsque le processus se termine.
remarqué
Dans les applications multithread, assurez-vous que l'accès aux données DLL globales est synchronisé (thread safe) pour éviter toute corruption potentielle des données. Pour ce faire, utilisez TLS pour fournir des données uniques pour chaque thread.
Exporter les fonctions DLL
Pour exporter des fonctions DLL, vous pouvez ajouter un mot clé de fonction aux fonctions DLL exportées ou créer un fichier de définition de module (.def) qui répertorie les fonctions DLL exportées.
Pour utiliser un mot-clé de fonction, vous devez déclarer chaque fonction à exporter avec le mot-clé suivant :__declspec(dllexport)
Pour utiliser les fonctions DLL exportées dans l'application, vous devez déclarer chaque fonction à importer avec le mot-clé suivant :__declspec(dllimport)
.
Généralement, vous utilisez un fichier d'en-tête qui contient une instruction de définition et unsevrer
de séparer la déclaration d'exportation et la déclarationimporter
.
Vous pouvez également utiliser un fichier de définition de module pour déclarer les fonctions DLL exportées. Si vous utilisez un tel fichier, vous ne devez pas ajouter de mot-clé de fonction aux fonctions DLL exportées. Dans le fichier de définition du module, vous déclarez les instructionsBIBLIOTHÈQUE
etEXPORTE
pour la dll. Le code suivant est un exemple de fichier de définition :
// SampleDLL.def//LIBRARY "sampleDLL" EXPORTE HelloWorld
Exemple de DLL et d'application
Dans VisualC++ 6.0, vous pouvez créer une DLL en sélectionnant le type de projetWin32-Dynamic-Link-BibliothekouMFC-AppWizard (dll).
Le code suivant est un exemple de DLL créée dans VisualC++ à l'aide du type de projetWin32-Dynamic-Link-Bibliothek.
// SampleDLL.cpp//#include "stdafx.h"#define EXPORTING_DLL#include "sampleDLL.h"BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved){ return TRUE;}void HelloWorld(){ MessageBox( NULL , TEXT("Hallo Welt"), TEXT("In einer DLL"), MB_OK);}// Datei : SampleDLL.h//#ifndef INDLL_H #define INDLL_H #ifdef EXPORTING_DLL extern __declspec(dllexport) void HelloWorld(); #else extern __declspec(dllimport) void HelloWorld(); #endif#endif
Le code suivant est un exemple de projetApplication Win32qui appelle la fonction DLL exportée dans la DLL SampleDLL.
// SampleApp.cpp//#include "stdafx.h"#include "sampleDLL.h"int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){ HelloWorld(); gib 0 zurück;}
remarqué
La liaison dynamique au moment du chargement nécessite que vous liiez la bibliothèque d'importation SampleDLL.lib, qui est créée lors de la génération du projet SampleDLL.
Lors d'une liaison dynamique au moment de l'exécution, utilisez un code similaire au suivant pour appeler la fonction DLL exportée de SampleDLL.dll.
...typedef VOID (*DLLPROC) (LPTSTR);...HINSTANCE hinstDLL;DLLPROC HelloWorld;BOOL fFreeDLL;hinstDLL = LoadLibrary("sampleDLL.dll");if (hinstDLL != NULL){ HelloWorld = (DLLPROC) GetProcAddress (hinstDLL, "HelloWorld"); if (HelloWorld != NULL) (HelloWorld); fFreeDLL = FreeLibrary(hinstDLL);}...
Lorsque vous compilez et liez l'application SampleDLL, le système d'exploitation Windows recherche la DLL SampleDLL aux emplacements suivants et dans cet ordre :
Le dossier de candidature
Le dossier actif
Ordre du système Windows
remarqué
La fonction GetSystemDirectory renvoie le chemin d'accès au dossier système Windows.
(Video) Tuto Windows | Comment nettoyer les DLL (bibliothèques dynamiques) chargées en mémoireLe dossier Windows
remarqué
La fonction GetWindowsDirectory renvoie le chemin du dossier Windows.
Assemblage .NET Framework
Avec l'avènement de .NET et .NETFramework, la plupart des problèmes liés aux DLL ont été éliminés à l'aide d'assemblys. Un assembly est une unité logique de fonctionnalité qui s'exécute sous le contrôle du Common Language Runtime (CLR) .NET. Un assembly existe physiquement sous la forme d'un fichier .dll ou .exe. Cependant, un assembly est intrinsèquement différent d'une DLL Microsoft Win32.
Un fichier d'assembly contient un manifeste d'assembly, des métadonnées de type, du code Microsoft Intermediate Language (MSIL) et d'autres ressources. Le manifeste d'assembly contient les métadonnées d'assembly, qui fournissent toutes les informations nécessaires pour qu'un assembly soit auto-descriptif. Les informations suivantes sont incluses dans le manifeste d'assembly :
- nom de l'assemblage
- Informations sur les versions
- Informations sur la culture
- Informations sur les noms forts
- Assemblage-Dateiliste
- Entrez les informations de référence
- Informations sur les assemblys dépendants et référencés
Le code MSIL contenu dans l'assembly ne peut pas être exécuté directement. Son exécution est assurée par le CLR. Par défaut, lorsque vous créez un assembly, il est privé pour l'application. Pour créer un assembly partagé, vous devez attribuer un nom fort à l'assembly, puis publier l'assembly dans le Global Assembly Cache.
La liste suivante compare certaines des fonctionnalités des assemblys aux fonctionnalités de DLLWin32 :
Autodescriptif
Lorsque vous créez un assembly, toutes les informations nécessaires à l'exécution du CLR sont incluses dans le manifeste de l'assembly. Ce manifeste contient une liste d'assemblys dépendants. Cela permet au CLR de maintenir la cohérence des assemblys utilisés dans l'application. Dans les DLL Win32, vous ne pouvez pas maintenir la cohérence dans un ensemble de DLL utilisées dans une application si vous utilisez des DLL partagées.
contrôle de version
Les informations de version sont enregistrées dans un manifeste d'assembly et appliquées par le CLR. Les stratégies de version vous permettent également d'appliquer une utilisation spécifique à la version. Dans les DLL Win32, le contrôle de version ne peut pas être implémenté par le système d'exploitation. Vous devez vous assurer que les DLL sont rétrocompatibles.
Déploiement côte à côte
Les assemblages prennent en charge le déploiement côte à côte. Une application peut utiliser une version d'un assembly et une autre application peut utiliser une version différente du même assembly. Apparu dans Windows 2000, le déploiement côte à côte est pris en charge en plaçant des DLL dans le dossier Applications. De plus, la fonctionnalité de protection des fichiers de Windows empêche le remplacement des DLL système par un agent non autorisé.
autonomie et isolement
Une application développée à l'aide d'un assembly peut être autonome et isolée des autres applications exécutées sur l'ordinateur. Cette fonctionnalité vous aide à créer des installations sans impact.
exécution
Un assembly s'exécute avec les autorisations de sécurité fournies dans le manifeste d'assembly et contrôlées par le CLR.
Indépendance linguistique
Un assemblage peut être développé à l'aide de l'un des langages pris en charge par .NET. Par exemple, vous pouvez développer un assembly dans Microsoft VisualC#, puis utiliser cet assembly dans un projet Visual Basic.NET.
les références
Déploiement et configuration d'applications(seulement en anglais)
(Video) Point d'entrée introuvable Bibliothèque de liens dynamiques Windows 11 Fix | Tout jeu ou applicatiorassemblements
Liaison dynamique à l'exécution
Stock local du fil