Erstellung einer DLL

PureBasic ermöglicht das Erstellen einer Standard Microsoft Windows DLL (Dynamic Linked Library). Der DLL Code entspricht "normalem" PureBasic Code, mit der Ausnahme, dass außerhalb von Prozeduren kein eigentlicher Programmcode geschrieben werden sollte.

Beim Schreiben einer DLL wird sämtlicher Code innerhalb von Prozeduren ausgeführt. Wenn eine Prozedur 'public' (öffentlich) sein soll (d.h. darauf durch dritte Programme zugegriffen werden kann, die die DLL benutzen), dann wird das Schlüsselwort ProcedureDLL (oder ProcedureCDLL wenn die Prozedur im 'CDecl' Format vorliegen muss, was bei regulären Windows DLL nicht der Fall ist) anstelle von Procedure (und DeclareDLL oder DeclareCDLL anstelle von Declare) benutzt. Dies ist die einzige notwendige Änderung am Programm.

Nachdem dies erfolgte, wählen Sie 'Shared DLL' als Ausgabeformat (Fenster 'Compiler-Optionen' im PureBasic Editor) oder den Zusatz '/DLL' bei Verwendung des Compilers im Kommandozeilenmodus und eine DLL mit dem von Ihnen eingegebenen Namen (im "Speichern unter" Requester bei Benutzung des Editors) wird im ausgewählten Verzeichnis erstellt.

Beispiel:

  ProcedureDLL MyFunction()
    MessageRequester("Hallo", "Dies ist eine PureBasic DLL !", 0)
  EndProcedure
    
  ; Hier das Client Programm, welches die DLL benutzt
  ;
  If OpenLibrary(0, "PureBasic.dll")
    CallFunction(0, "MyFunction")
    CloseLibrary(0)
  EndIf
Nur für fortgeschrittene Anwender: es gibt 4 spezielle Prozeduren, die von Windows automatisch aufgerufen werden, wenn eines der folgenden Ereignisse auftritt:

- DLL wurde zu einem neuen Prozess hinzugefügt
- DLL wurde von einem Prozess entfernt
- DLL wurde zu einem neuen Thread hinzugefügt
- DLL wurde von einem Thread entfernt
Um diese Ereignisse zu verwalten, ist es möglich, 4 spezielle Prozeduren zu deklarieren: AttachProcess(Instanz), DetachProcess(Instanz), AttachThread(Instanz) und DetachThread(Instanz). Dies bedeutet, dass diese 4 Prozedur-Namen reserviert sind und vom Programmierer nicht für andere Zwecke verwendet werden können.

Hinweise zur Erstellung von DLL's:

- Die Deklaration von Arrays und LinkedLists mittels Dim bzw. NewList muss stets innerhalb der Prozedure AttachProcess erfolgen.
- Schreiben Sie keinen Programmcode außerhalb von Prozeduren. Als Ausnahmen erlaubt sind lediglich Variablen- oder Strukturen-Deklarationen.
- DirectX Initialisierungsroutinen dürfen nicht innerhalb der AttachProcess Prozedur geschrieben werden.
Hinweise zur Rückgabe von Strings aus DLL's:

Bei der Rückgabe von Strings aus einer DLL-Funktion muß der String als Global deklariert sein.

Beispiel:

  Global ReturnString$
  
  ProcedureDLL.s MyFunction(var.s)
    ReturnString$ = var + " test"
    ProcedureReturn ReturnString$
  EndProcedure
Ohne die Deklaration als Global ist der String nur Lokal in der ProcedureDLL verfügbar und kann somit nicht außerhalb verwendet werden.

Bei der Verwendung von CallFunction() (oder einer ihrer verwandten CallXXX-Funktionen) auf eine DLL-Funktion wird bei der Rückgabe eines Strings immer ein Zeiger auf diesen zurückgegeben, welcher mit PeekS() ausgelesen werden muss.

Beispiel:

  String.s = PeekS(CallFunction(0,"FunctionName",Parameter1,Parameter2))
Nachfolgend noch ein komplettes Code-Beispiel:

Beispiel

DLLSample.pb