Chargement statique ou dynamique de DLL avec Delphi

Une DLL (Dynamic Link Library) agit comme une bibliothèque partagée de fonctions qui peuvent être sollicitées par de nombreuses applications et autres DLL. Delphi vous permet créer et utiliser des DLL afin que vous puissiez appeler ces fonctions à volonté. Cependant, vous devez importer ces routines avant de pouvoir les appeler.

Les fonctions exportées à partir d'une DLL peuvent être importées de deux manières: soit en déclarant une procédure ou une fonction externe (statique), soit en appelant directement des fonctions API spécifiques à la DLL (dynamiques).

Prenons un simple DLL. Ci-dessous se trouve le code pour "circle.dll" d'exporter une fonction, appelée "CircleArea", qui calcule l'aire d'un cercle en utilisant le rayon donné:

Une fois que vous avez le fichier circle.dll, vous pouvez utiliser la fonction "CircleArea" exportée depuis votre application.

Chargement statique

Le moyen le plus simple d'importer une procédure ou une fonction est de le déclarer à l'aide de la directive externe:

instagram viewer

Si vous incluez cette déclaration dans la partie interface d'une unité, circle.dll est chargé une fois au démarrage du programme. Tout au long de l'exécution du programme, la fonction CircleArea est disponible pour toutes les unités qui utilisent l'unité où se trouve la déclaration ci-dessus.

Chargement dynamique

Vous pouvez accéder aux routines d'une bibliothèque via des appels directs aux API Win32, notamment LoadLibrary, FreeLibrary, et GetProcAddress. Ces fonctions sont déclarées dans Windows.pas.

Voici comment appeler la fonction CircleArea à l'aide du chargement dynamique:

Lors de l'importation à l'aide du chargement dynamique, la DLL n'est pas chargée jusqu'à l'appel à LoadLibrary. La bibliothèque est déchargée par le appel à FreeLibrary.

Avec le chargement statique, la DLL est chargée et ses sections d'initialisation s'exécutent avant l'exécution des sections d'initialisation de l'application appelante. Ceci est inversé avec le chargement dynamique.

Devez-vous utiliser statique ou dynamique?

Voici un aperçu des avantages et des inconvénients du chargement des DLL statiques et dynamiques:

Chargement statique

Avantages:

  • Plus facile pour un développeur débutant; pas "moche" Appels API.
  • Les DLL sont chargées une seule fois, au démarrage du programme.

Les inconvénients:

  • L'application ne démarre pas si des DLL sont manquantes ou introuvables. Un message d'erreur comme celui-ci apparaîtra: "Cette application n'a pas pu démarrer car 'missing.dll' est introuvable. Réinstaller l'application peut résoudre ce problème". De par leur conception, l'ordre de recherche de DLL avec liaison statique inclut le répertoire à partir duquel l'application chargé, le répertoire système, le répertoire Windows et les répertoires répertoriés dans l'environnement PATH variable. Notez également que l'ordre de recherche peut être différent pour différentes versions de Windows. Attendez-vous toujours à avoir toutes les DLL dans le répertoire où se trouve l'application appelante.
  • Plus de mémoire est utilisée car toutes les DLL sont chargées même si vous n'utilisez pas certaines des fonctions.

Chargement dynamique

Avantages:

  • Vous pouvez exécuter votre programme même lorsque certaines des bibliothèques qu'il utilise ne sont pas présentes.
  • Réduction de la consommation de mémoire car les DLL ne sont utilisées qu'en cas de besoin.
  • Vous pouvez spécifier le chemin d'accès complet à la DLL.
  • Peut être utilisé pour des applications modulaires. L'application expose uniquement (charge) les modules (DLL) "approuvés" pour l'utilisateur.
  • La possibilité de charger et décharger la bibliothèque dynamiquement est la base d'un système de plug-in qui permet à un développeur d'ajouter des fonctionnalités supplémentaires aux programmes.
  • Compatibilité descendante avec les anciennes versions de Windows dans lesquelles les DLL système peuvent ne pas prendre en charge les mêmes fonctions ou être prises en charge de la même manière. La détection de la version Windows en premier, puis la liaison dynamique en fonction de ce sur quoi votre application fonctionne, vous permet de prendre en charge plus versions de Windows et fournir des solutions de contournement pour les anciens systèmes d'exploitation (ou tout au moins, désactiver gracieusement les fonctionnalités soutien.)

Les inconvénients:

  • Nécessite plus de code, ce qui n'est pas toujours facile pour un développeur débutant.