FAQ PascalConsultez toutes les FAQ

Nombre d'auteurs : 10, nombre de questions : 400, dernière mise à jour : 12 septembre 2016  Ajouter une question

 

Bienvenue dans la F.A.Q. Pascal !

Celle-ci rassemble les réponses aux questions les plus fréquemment posées sur le langage Pascal et tous ses outils de programmation. Si elle n'a pas pour vocation de répondre à toutes les interrogations possibles, elle reste une bonne base de connaissances sur le Pascal, et ne demande qu'à être enrichie par vos expériences personnelles.

Nous vous invitons à proposer vos propres questions/réponses directement dans la FAQ ou, si vous souhaitez apporter une modification à une question/réponse existante, à la poster dans le fil de discussion renseigné ci-dessous.

Nous vous souhaitons une bonne lecture !

L'équipe Pascal.

Commentez


SommaireLe fonctionnement du systèmeWindows (3)
précédent sommaire suivant
 

DLL est l'acronyme de Dynamic Linked Library, c'est-à-dire bibliothèque dynamiquement liée en français. Une DLL est une bibliothèque de routines qui peuvent être exécutées par un programme sans qu'elles soient contenues dans son fichier exécutable. À la différence d'une unité, qui est liée une fois pour toutes au programme au moment de la compilation, la DLL est liée dynamiquement au programme pendant son exécution.

Que peut contenir une DLL ?

  • des procédures et fonctions (bien entendu) ;
  • des objets ;
  • des ressources binaires (dialogues, tables de chaînes, etc.).

Mis à jour le 19 août 2007 Alcatîz

La structure du fichier source d'une DLL est la suivante :

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  
Library MADLL; 
  
Uses Windows; 
  
Procedure MAPROC1 (x, y : Integer); export; 
Begin 
  ... 
End; 
  
Function MAFONC2 : Boolean; export; 
Begin 
  ... 
End; 
  
Exports   { Liste des routines exportables } 
  
  MAPROC1   index 1   name 'ProcPerso', 
  MAFONC2   index 2   name 'FoncPerso'; 
  
Begin 
  ...   { Code d'initialisation éventuel } 
End.
Ce qu'il faut retenir :
  • le source doit commencer par le mot-clé library (à la place de program ou unit) ;
  • chaque procédure ou fonction publique doit être accompagnée de la directive export ;
  • la liste des routines exportées se trouve dans la section Exports ;
  • dans la section Exports, chaque routine reçoit un n° d'index unique et, éventuellement, un alias (directive name).

La directive export donne automatiquement à la routine l'attribut far et inclut l'ajout de code additionnel d'entrée et de sortie.

Mis à jour le 19 août 2007 Alcatîz

On distingue deux méthodes d'importation : l'une, statique, dans laquelle les références des routines de la DLL sont connues et fixées dès le départ et l'autre, dynamique, dans laquelle on fait appel à des routines de l'API pour localiser les routines dans la DLL en cours d'exécution.

  • Importation statique

La manière la plus simple d'utiliser une DLL est de créer une unité d'import qui va servir d'interface entre le programme et la DLL. Une telle unité est tout à fait classique hormis que, traditionnellement, elle ne contient que rarement du code.

Voici un exemple d'unité d'import destinée à un programme qui va se servir de l'exemple de DLL du 1er lien ci-dessous :

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  
Unit MALIB; 
  
Interface 
  
Uses Windows; 
  
Procedure MAPROC1 (x, y : Integer); 
Function MAFONC2 : Boolean; 
  
Implementation 
  
Procedure MAPROC1;   external 'MADLL' index 1; 
Function MAFONC2;    external 'MADLL' index 2; 
  
End.
Dans la section Implementation, les routines de la DLL sont énumérées à l'aide de la directive external suivie du nom de la DLL et de l'index de la routine dans cette dernière.

En définitive, pour pouvoir utiliser les routines de la DLL, le programme déclarera l'unité d'import dans sa clause uses et appellera les routines exactement comme si elles étaient écrites dans l'exécutable.
  • Importation dynamique

L'importation dynamique consiste à faire au cours de l'exécution du programme ce qui est réalisé automatiquement par l'unité d'import.
Les avantages de l'importation dynamique sur l'importation statique sont les suivants :
  • les changements apportés aux index des routines exportables d'une DLL ne nécessitent pas de recompiler l'unité d'import ainsi que les programmes qui l'utilisent ;
  • seules les routines de la DLL utilisées par le programme doivent être déclarées, alors que l'unité d'import les déclare toutes : économie de symboles pour le compilateur ;
  • un programme ayant recours à plusieurs DLL peut les charger et décharger à volonté.

L'importation dynamique requiert la déclaration des procédures ou fonctions d'une DLL sous forme de variables ou constantes typées de type procedure ou function.
Par exemple, pour pouvoir utiliser les routines de la DLL du 1er lien ci-dessous :

Code delphi : Sélectionner tout
1
2
3
4
5
6
  
Type tProc1 = Procedure (x, y : Integer); 
     tFonc2 = Function : Boolean; 
  
Var MaProc1 : tProc1; 
    MaFonc2 : tFonc2;
La première étape consiste à charger en mémoire le code de la DLL, à l'aide de la fonction de l'API LoadLibrary.
La deuxième étape est la recherche de la routine désirée à l'aide de la fonction GetProcAddress.
La dernière étape, à ne pas oublier : décharger la DLL, lorsqu'elle n'aura plus d'utilité pour le programme, à l'aide de FreeLibrary.

Exemple :

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
  
Type tProc1 = Procedure (x, y : Integer); 
  
Var MaProc1 : tProc1;   { Adresse de la routine } 
    hDLL : tHandle;     { Handle de la DLL } 
  
Begin 
  { Chargement de la DLL } 
  hDLL := LoadLibrary('MADLL.DLL'); 
  { Erreur si handle < 32 } 
  if hDLL >= 32 
     then 
       begin 
         { Recherche de la routine dans la DLL } 
         @MaProc1 := GetProcAddress(hDLL,'ProcPerso'); 
         if @MaProc1 <> Nil 
            then 
              begin 
                ... 
                { utilisation de la routine } 
                MaProc1(12,31); 
                ... 
              end 
            else 
              { Routine non trouvée } 
         { Déchargement de la DLL } 
         FreeLibrary(hDLL); 
       end 
     else 
       { Erreur de chargement de la DLL } 
End.

Mis à jour le 19 août 2007 Alcatîz

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2017 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

 
Responsables bénévoles de la rubrique Pascal : Gilles Vasseur - Alcatîz -