Construire une DLL

Introduction

PureBasic permet de créer des librairies dynamiques liées au standard Microsoft Windows (DLL : Dynamic Linked Library). 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)
  EndIf
Pour 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 about creating DLL's:

- The declaration of arrays and LinkedLists with Dim or NewList must always be done inside the procedure AttachProcess.
- Don't write program code outside procedures. The only exception is the declaration of variables or structures.
- DirectX initialization routines must not be written in the AttachProcess procedure.

Note about returning strings from DLL's:

If you want to return a string out of a DLL, the string has to be declared as Global before using it.

Exemple:

  Global ReturnString$
  
  ProcedureDLL.s MaFonction(var.s)
    ReturnString$ = var + " test"
    ProcedureReturn ReturnString$
  EndProcedure
Without declaring it as Global first, the string is local to the ProcedureDLL and cant be accessed from outside.

When using CallFunction() (or one of its similar CallXXX functions) on a DLL function you will get a pointer on the return string, which you could read with PeekS().

Exemple:

  String.s = PeekS(CallFunction(0,"NomFonction",Parametre1,Parametre2))
Vous trouverez ci dessous un exemple complet:

Exemple

DLLSample.pb