Construire une DLL
Introduction
PureBasic permet de créer des DLL Microsoft Windows (DLL : Dynamic Linked Library), des objets partagés (.so) sous Linux, et des bibliothèques dynamiques (.dylib) sous MacOS X. Le code d'une DLL est de même nature que le code PureBasic excepté qu'aucun code ne peut exister en dehors d'une procédure. Lors de l'écriture d'une DLL, tout le code est intégré dans des procédures. Lorsqu'une procédure doit être publique (accessible par un programme tiers qui doit accéder à la DLL), le mot clef ProcedureDLL est utilisé au lieu de Procedure. C'est la seule différence pour écrire un programme.
Lorsque le codage est ainsi fait, il suffit de sélectionner 'Shared DLL' comme format de sortie (fenêtre 'Compiler Option' dans l'éditeur PureBasic ou commutateur /DLL dans la ligne de commande) et de créer un exécutable.Exemple:
ProcedureDLL MaFonction() MessageRequester("Bonjour", "Voici une DLL PureBasic !", 0) EndProcedure ; Voici le programme client qui utilise la DLL ; If OpenLibrary(0, "PureBasic.dll") CallFunction(0, "MaFonction") CloseLibrary(0) EndIfPour les programmeurs avancés, il existe 4 procédures spéciales qui sont appelées par Windows lorsque l'un des évènements suivants survient:
- une DLL est attachée à un nouveau process
- une DLL est détachée d'un process
- une DLL est attachée à un nouveau thread
- une DLL est détachée d'un thread
Pour gérer cela, il est possible de déclarer 4 procédures spéciales nommées: AttachProcess(Instance), DetachProcess(Instance), AttachThread(Instance) et DetachThread(Instance). Cela signifie que ces 4 noms sont réservés et ne peuvent être utilisés par le programmeur pour d'autres usages.
Notes à propos de la création des DLL's:
- La déclaration des tableaux, des listes chaînées ou des maps doivent toujours être faite dans la procédure 'AttachProcess()'.
- Ne pas écrire de code en dehors des procédures. La seule exception est pour la déclaration des variables ou des structures.
- Les routines d'initialisation DirectX ne doivent pas être dans la procédure 'AttachProcess()'.
A propos de retour de string dans une DLL's:
Pour qu'une fonction puisse renvoyer un string, il doit être déclaré en global.Exemple:
Global ReturnString$ ProcedureDLL.s MaFonction(var.s) ReturnString$ = var + " test" ProcedureReturn ReturnString$ EndProcedureSi le string n'est pas déclaré en global, il sera local à la procédure, et donc libéré lors de la fin de la procédure. Il ne pourra pas être utilisé par le programme appelant la fonction.
Quand CallFunction() est utilisé sur une fonction de DLL qui renvoie un pointeur vers une chaîne de caractères, il pourra être lu avec Link "memory/peeks" "PeekS()".Exemple:
String.s = PeekS(CallFunction(0, "NomFonction", Parametre1, Parametre2))Vous trouverez ci dessous un exemple complet:
Exemple
DLLSample.pb