Erstellung einer DLL

PureBasic ermöglicht das Erstellen einer Standard Microsoft Windows DLL ("Dynamic Linked Library"), "shared objects" (.so) auf Linux, und "dynamic libraries" (.dylib) auf MacOS X. 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' in der PureBasic-IDE) oder den Zusatz '/DLL' bei Verwendung des Compilers im Kommandozeilenmodus. Im "Executable erstellen" Speichern-Dialog (bei Verwendung der PureBasic-IDE) wird nun eine DLL mit dem von Ihnen eingegebenen Namen 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 Programmierer: Es gibt 4 spezielle Prozeduren, die vom OS 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, Listen bzw. Maps mittels Dim, NewList bzw. NewMap muss stets innerhalb der Prozedur AttachProcess erfolgen.
- Schreiben Sie keinen Programmcode außerhalb von Prozeduren. Als Ausnahmen erlaubt sind lediglich Variablen- oder Strukturen-Deklarationen.
- Standard-Werte in Prozedur-Parametern haben keinen Effekt.
- 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