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.
1. Création de la DLL
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.
//---------------------------------------------------------------------------#include <vcl.h>#include <windows.h>#pragma hdrstop//---------------------------------------------------------------------------// Important note ... bla bla ...//---------------------------------------------------------------------------#pragma argsusedint WINAPI DllEntryPoint(HINSTANCE hinst, unsignedlong reason, void* lpReserved)
{
return 1;
}
//---------------------------------------------------------------------------
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
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.
2. Utilisation statique de la DLL
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.
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
4. Passage de paramètres à une fonction exportée
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
extern"C"__declspec(dllexport) __stdcall TDateTime AddDayToDate(TDateTime dt, int nbDay);
// Add a number of days to a Date and returns the new date (dummy sample)
TDateTime __stdcall AddDayToDate(TDateTime dt, int nbDay)
{
dt += nbDay;
return dt;
}
__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.
void__fastcall TForm3::Button2Click(TObject *Sender)
{
int i Ret;
foo *Foo;
Foo = new foo();
Foo->N1 = 5;
Foo->N2 = 15;
Foo->AddN();
iRet = Foo->GetResult();
delete Foo;
}
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 :
celui de la fenêtre principale de l'application
celui de la fenêtre contenue dans la DLL.
Pour résoudre ce petit problème, il suffit d'attribuer le Handle de l'Application principale à celui de la DLL.
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.
Responsable bénévole de la rubrique C : Arnaud Feltz (buchs) - Contacter par EMail :