Import : EndImport


Syntax
Import "Dateiname"
  FunktionsName.<Typ>(<Parameter>, [, <Parameter> [= StandardWert]...]) [As "SymbolName"]
  ...
  VariablenName.<Typ> [As "SymbolName"]
EndImport
Beschreibung
Für fortgeschrittene Programmierer. Import : EndImport ermöglicht das einfache Deklarieren externer Funktionen und Variablen aus einer Library (.lib) oder Objekt (.obj) Datei.

Sobald diese deklariert wurden, sind die importierten Funktionen wie jeder andere Befehl direkt zur Verwendung im Programm verfügbar. Der Compiler überprüft nicht, ob die Funktion tatsächlich in der importierten Datei existiert; wenn also ein Fehler auftritt, wird dieser direkt vom Linker mitgeteilt.

Dieses Feature kann die OpenLibrary()/CallFunction() Sequenz ersetzen, da sie einige Vorteile bietet: es erfolgt eine Typen-Überprüfung, die Anzahl an Parametern wird geprüft. Nicht wie bei CallFunction() können ohne Probleme Doubles, Fließkomma und Quad Variablen verarbeitet werden.

Die letzten Parameter können einen Standard-Wert (muss ein konstanter Ausdruck sein) haben. Wenn also diese Parameter beim Funktionsaufruf weggelassen werden, wird der Standardwert verwendet.

Standardmäßig wird der importierte Funktionsname (Funktionssymbol) auf folgende Art und Weise 'dekoriert': _FunctionName@callsize(Funktionsname und Aufrufgröße). Dies sollte bei den meisten Funktionen funktionieren, welche die Standardaufruf Konvention (stdcall) verwenden. Wenn es sich bei der Library um eine C Library handelt und die Funktionen nicht stdcall entsprechen, sollte stattdessen die ImportC Variante verwendet werden. In diesem Fall wird das standardmäßige Funktionssymbol wie folgt 'dekoriert': _FunctionName (nur Funktionsname).

Die Pseudotypes können für die Parameter verwendet werden, jedoch nicht für den Rückgabewert.

Anmerkungen

Auf x64 gibt es nur eine Aufruf-Konvention, somit werden sich ImportC und Import auf die selbe Weise verhalten.

Beispiel

  Import "User32.lib"
   
    ; Keine Notwendigkeit für die Verwendung von 'As' da PureBasic die Funktion
    ; korrekt dekoriert.
    ; Wir definieren die 'Flags' auch als optional, mit einem Standardwert 
    ; von 0 (wenn sie weggelassen werden).
    ;
    MessageBoxA(Window.i, Body$, Title$, Flags.i = 0)
    
    ; Diesmal findet PureBasic sie nicht allein, da der Funktionsname nicht
    ; der gleiche ist, wie der vom Funktionssymbol verwendete.
    ;
    MsgBox(Window.i, Body$, Title$, Flags.i) As "_MessageBoxA@16"
                                                   
  EndImport
  
  MessageBoxA(0, "Hello", "World") ; wir geben keine Flags an
  MsgBox(0, "Hello", "World 2", 0)
    

Beispiel: Mit Pseudotypes

  Import "User32.lib"
   
    ; Wir verwenden den 'p-unicode' Pseudotype für die String Parameter, da
    ; MessageBoxW() eine nur unter Unicode verwendbare Funktion ist. Der Compiler
    ; wird - sofern notwendig - die Strings automatisch nach Unicode konvertieren.
    ;
    MessageBoxW(Window.l, Body.p-unicode, Title.p-unicode, Flags.l = 0)
                                                  
  EndImport
  
  MessageBoxW(0, "Hello", "World")