Création et utilisation d'une DLL sous C++ Builder13/10/2002
Par
LFE (autres articles) Ce document a pour but de présenter la création et l'utilisation d'une DLL suis C++ Builder Avant-Propos 1. Création de la DLL 2. Utilisation statique de la DLL 3. Utilisation dynamique de la DLL 4. Passage de paramètres à une fonction exportée 5. Utilisation statique d'une DLL "étrangère" 6. Utilisation d'une classe contenue dans une DLL 7. TForm dans la DLL : n'afficher que la fenêtre principale de l'application dans la barre des tâches
Travaillant sous C++ Builder Enterprise 6.0 en version anglaise, tous les noms des menus, options, .... seront en anglais.
L'utilisation de cette langue pour le code et les commentaires éventuels sont simplement le résultat d'une habitude de
codage.
J'espère que l'explication qui va suivre est claire. Si ce n'était pas le cas, je suis ouvert à toute critique
ou remarque, pour autant qu'elle soit constructive.
Le code est minimal dans la mesure où le but est d'expliquer un principe et non de réaliser une application complète.
Créer un nouveau projet.
Dans le menu File, séléctionner New, Other ...
Dans la fenêtre qui apparaît à ce moment, sélectionner le "DLL Wizard"
Une seconde fenêtre apparaît.
La DLL que nous allons créer sera en C++ et elle contiendra une fenêtre à afficher, la case VCL doit
donc être cochée. Cette case doit être cochée dès que l'on utilise un élément de la VCL.
L'assistant BCB génére le code suivant.
Créer ensuite une fenêtre minimale. Dans le menu File, New, sélectionner Form. Déposer dessus un Button
Le code éxécute par le clic sur le bouton est le suivant
Modifier ensuite le code du projet de la DLL de la façon suivante ;
La fonction LoadForm sera la fonction qui sera exportée de la DLL et pourra être appelée depuis le programme principal,
c'est pour cela qu'elle est déclarée dllexport.
Sauvegarder le tout et compiler.
Un fichier LIB et une DLL sont créés.
Créer un nouveau projet. Dans le menu File, séléctionner New, Application A nouveau, créer une application minimale : une fenêtre avec un bouton.
Modifier ensuite le code de la façon suivante :
Cette fois, la fonction LoadForm est déclarée dllimport étant donné qu'elle n'est plus exportée de la DLL,
mais importée dans le programme.
Ajouter la librairie d'import dans le projet (le LIB). Dans le menu Project, Add To Project ... Sélectionner le fichier LIB.
Sauvegarder le tout, compiler et éxécuter.
Lorsque l'on appuie sur le bouton de la première fenêtre, la seconde apparaît et disparaît lorsque l'on
clique sur le bouton.
Créer un nouveau projet. Dans le menu File, séléctionner New, Application A nouveau, créer une application minimale : une fenêtre avec un bouton.
Modifier ensuite le code de la façon suivante
typedef int (__stdcall *MYDLLFUNC)(void); est la déclaration du type de la fonction qui est importée de la DLL.
La fonction GetProcAdress renvoie un pointeur sur une fonction.
Le cast vers le bon type est nécessaire pour pouvoir passer les paramètres éventuels à la fonction importée.
LoadLibrary charge la DLL en mémoire, et retourne un handle permettant d'y accéder.
GetProcAdress prend en paramètre le handle de la DLL et le nom d'une fonction.
Si la fonction est trouvée dans la DLL, GetProcAdress renvoie son adresse, sinon NULL.
L'appel de la fonction importée se fait de façon tout à fait classique, non par son nom, mais par le nom du pointeur associé.
Ne pas oublier de décharger la DLL quand elle n'est plus utilisée, par FreeLibrary
Le passage de paramètres à une fonction exportée d'une DLL se fait de façon tout à fait normale dans le cas de
l'utilisation statique.
Seule l'utilisation dynamique présente une particularité :
il faut faire un cast explicite du pointeur de retour de GetProcAdress.
Code de la fonction dcontenue dans la DLL
Code d'appel dans le programme
Il est nécessaire de disposer de 2 choses :
Ce fichier d'en-tête doit être ajouté à tous les fichiers sources utilisants les fonctions de la DLL.
Création de la librairie d'import. dans une fenêtre DOS, exécuter la commande suivante IMPLIB <nom_de_la_DLL>.LIB <nom_de_la_DLL>.DLL
Ajouter la librairie d'import dans le projet.
Dans le menu Project, Add To Project ... Sélectionner le fichier LIB.
Les fonctions déclarées s'appelent de façon tout à fait classique
L'utilisation d'une classe contenue dans une DLL est fort semblable à l'utilisation statique d'une DLL.
Création de la classe dans la DLL
foo.h
foo.cpp
__DLL__ est une macro définie par le compilateur lors de la création d'un projet DLL. La façon dont est défini le code de foo.h permet de n'avoir qu'un seul source pour la DLL et pour le header qui doit être inclus au projet principal.
Ajouter la librairie d'import dans le projet. Dans le menu Project, Add To Project ... Sélectionner le fichier LIB.
Lors de l'instanciation de la classe contenue dans la DLL, l'utilisation est tout à fait classique.
7. TForm dans la DLL : n'afficher que la fenêtre principale de l'application dans la barre des tâches
Lorsqu'une Form est contenue dans une DLL, l'utilisation de celle-ci fait apparaître dans la barre des tâches 2 boutons :
Pour résoudre ce petit problème, il suffit d'attribuer le Handle de l'Application principale à celui de la DLL.
Dans le code de la DLL, cela se traduit par :
et dans le code du programme principal :
Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur.
La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.
|