CREATION DE DLL DELPHI
dernière mise à jour le : samedi 29 janvier 2000 (remplacement de label3.caption par Form.label3.caption)
Une DLL pourquoi ?
Les DLL (bibliothèque dynamiquement liée) sont des fichiers exécutables (.dll) contenant des fonctions ou des procédures qui peuvent être appelées par des applications écrites en Delphi, C, C++, Paradox, dBase, VB... Elles permettent à la fois d'avoir des même fonctions ou procédures appelées par plusieurs programmes et d'écrire un programme à l'aide de plusieurs langages. Lorsque l'on met à jour une DLL, on n'a pas besoin de recompiler les applications qui l'appellent.
Création des DLL : principe
Pour créer une DLL, il suffit de créer un projet puis de faire quelques modifications et de le recompiler.
Prenons par exemple le projet suivant :source
Modification du projet
Faire les modifications suivantes dans le source du projet (pour l'atteindre: Delphi 3 faire Voir / Source du projet. Versions supérieures : faire Projet/Voir le source)
- Sur la première ligne du fichier, remplacer le mot program par le mot library,
- dans la clause uses de ce même fichier, retirer l'unité Forms,
- supprimer toutes les lignes situées entre le begin et le end.
Déclaration de la routine d'interface
Il faut alors déclarer et créer les fonctions et procédures qui seront mises à disposition des autres applications :
Modifions notre programme comme suit :
- dans la partie interface, ajoutons :
function plus(i,j:integer):integer;stdcall; // stdcall est une des 4 possibilités de type de gestion du passage de paramètres voir plus bas
- puis dans la partie implémentation :
function plus(i,j:integer):integer;
var Form:TForm1;
begin
Form:=Tform1.create(application);// création de la fiche
Form.ShowModal;// affichage de la fiche
Result:=StrToInt(Form.Label3.Caption);// Result est le résultat de notre fonction
Form.Free;// libération de la mémoireend;
- si vous utilisez des strings comme paramètres ou résultats de fonction voir ici
Exportation des routines :
Il faut également indiquer au programme le nom des fonctions et procédures qui sont "exportables" et sous quel nom on pourra les atteindre de "l'extérieur":
Mettre cette ligne dans la partie implémentation par exemple sous la description de la fonction "plus" décrite ci-dessus.exports plus name 'somme';// exporte la fonction plus qui sera atteignable par le nom somme.
voir plus bas les différentes exportations possiblesAttention aux majuscules : somme n'est pas le même nom que Somme
Voilà, c'est tout votre DLL est prête à être compilée (Ctr F9) et utilisée.
A ce stade, le source doit être ainsi: Source
Pour tester cette DLL,
vous pouvez télécharger puis compiler les sources du projet : utildll
N'oubliez pas de recopier votre DLL dans le dossier où se trouvent les fichiers dézippés de utildll.
Quelques précisions
si vos DLLs exportent des procédures ou des fonctions passant en paramètre des chaînes ou ayant des chaînes comme résultats de fonction : ShareMem doit être la première unité dans la clause USES de votre bibliothèque, ET dans la clause USES de votre projet
En ce cas, DELPHIMM.DLL doit être fournis avec votre application. Pour éviter l'emploi de DELPHIMM.DLL, passez vos chaînes en utilisant des paramètres PChar ou ShortString.
Mode de passage des paramètres
Dans la déclaration
function plus(i,j:integer):integer;stdcall;
stdcall est une des 4 possibilités de type de gestion du passage de paramètres.Le mode de gestion du passage de paramètres doit être le même que dans la fonction (ou procédure ) appelante et dépend donc du langage utilisé pour cette dernière.
Convention
type de convention
commentaire
register Registres Permet d'optimiser la vitesse d'accès aux paramètres pascal Pascal Méthodes plus rapide que celle du C cdecl C stdcall Win 32 Nouvelle convention apparue avec l'arrivé des versions 32 bits.
L'API windows 32 bits utilise cette convention.
Précision sur les différentes exportations des routines possibles:
exports plus name 'somme'; // exporte la fonction plus qui sera atteignable par le nom somme.
exports plus index 10; // exporte la fonction plus qui sera atteignable par son numéro d'indice : 10.
exportation par indice ou nom:
exports plus name 'somme' index 10;
La gestion des dll en 16 bits faisait que l'utilisation des indices permettait de meilleures performances. Ce n'est plus vrai en 32 bits. C'est pour cette raison qu'à partir de Delphi 2, les routines de l'API Windows ne sont plus importées par indice, mais seulement par nom.