Bibliothèque de liens dynamiques (DLL) – Client Windows (2023)

  • 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 :

(Video) Comment réparer la bibliothèque de liens dynamiques | Le point d'entrée de la procédure n'a pas pu

  • 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.localvide 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.localvide. 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 Fix

    Cet 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èqueouLoadLibraryExpour charger la DLL au moment de l'exécution. Une fois la DLL chargée, utilisez la fonctionGetProcAddresspour 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èqueouLoadLibraryEx. Aussi, vous ne devriez pas appeler la fonctionBibliothèque gratuitelorsque 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.

(Video) Le point d'entrée de procédure est introuvable dans la bibliothèque de liens dynamiques Français

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 unsevrerde 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ÈQUEetEXPORTEpour 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 :

  1. Le dossier de candidature

  2. Le dossier actif

  3. 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émoire

  4. Le 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 applicatio

  • rassemblements

  • Liaison dynamique à l'exécution

  • Stock local du fil

Videos

1. Ordinal introuvable, l'ordinal n'a pas pu être localisé dans la bibliothèque de liens dynamiques
(MDTechVideos International )
2. le point d'entree de procedure est introuvable kernel32 dll
(devices fixer)
3. dxgi.dll Error - Fix - 2022
(MK TECH)
4. The Procedure "Entry Point Not Found Dynamic Link Library" Error Fixing In Windows 10 / 11 / 7
(Easy Classes)
5. Point d'entrée introuvable Bibliothèque de liens dynamiques Windows 11
(How to Fix Your Computer)
6. How To Fix Qt5Core.dll Is Missing Error - Solve Qt5Core.dll Is Missing From Your Computer
(SoftTrick)
Top Articles
Latest Posts
Article information

Author: Lakeisha Bayer VM

Last Updated: 03/07/2023

Views: 5789

Rating: 4.9 / 5 (49 voted)

Reviews: 88% of readers found this page helpful

Author information

Name: Lakeisha Bayer VM

Birthday: 1997-10-17

Address: Suite 835 34136 Adrian Mountains, Floydton, UT 81036

Phone: +3571527672278

Job: Manufacturing Agent

Hobby: Skimboarding, Photography, Roller skating, Knife making, Paintball, Embroidery, Gunsmithing

Introduction: My name is Lakeisha Bayer VM, I am a brainy, kind, enchanting, healthy, lovely, clean, witty person who loves writing and wants to share my knowledge and understanding with you.