Prototypes


Syntax
Prototype.<Typ> Name(<Parameter>, [, <Parameter> [= StandardWert]...])
Beschreibung
Für fortgeschrittene Programmierer. Prototype ermöglicht das Deklarieren eines Typs, welcher eine Funktion abbildet (englisch "mapped"). Dies ist nützlich bei der Verwendung mit einer Variable, um einen Funktionszeiger zu erstellen (der Variablen-Wert wird die Adresse der aufzurufenden Funktion sein, und kann auf Wunsch verändert werden).

Dieses Feature kann die OpenLibrary() und CallFunction() Sequenz ersetzen, da sie einige Vorteile hat: Es erfolgt eine Typen-Überprüfung, die Anzahl an Parametern wird geprüft.

Anders als CallFunction() können Prototypes problemlos mit Doubles, Fließkomma und Quad Variablen umgehen. Um einfach den Zeiger einer Library-Funktion zu erhalten, verwenden Sie GetFunction().

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 die Funktionen die Standardaufruf Konvention (stdcall) verwenden. Wenn der Funktionszeiger ein C üblicher ist, dann sollte stattdessen die PrototypeC Variante verwendet werden.

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

Beispiel

  CompilerIf #PB_Compiler_OS <> #PB_OS_Windows
    CompilerError "This sample only works on Windows"
  CompilerEndIf

  Prototype.i ProtoMessageBox(Window.i, Body$, Title$, Flags.i = 0)

  If OpenLibrary(0, "User32.dll")
   
    ; 'MsgBox' ist eine Variable mit einem 'ProtoMessageBox' Typ
    ;
    MsgBox.ProtoMessageBox = GetFunction(0, "MessageBoxW")
    
    MsgBox(0, "Hello", "World") ; wir geben keine Flags an
  EndIf    

Beispiel: Mit Pseudotypes

  CompilerIf #PB_Compiler_OS <> #PB_OS_Windows
    CompilerError "This sample only works on Windows"
  CompilerEndIf

  ; Wir verwenden den 'p-ascii' Pseudotype für die String-Parameter, da
  ; MessageBoxA() eine reine ASCII-Funktion ist. Der Compiler wird -
  ; sofern notwendig - die Strings automatisch nach Unicode konvertieren.
  ;
  Prototype.i ProtoMessageBoxA(Window.i, Body.p-ascii, Title.p-ascii, Flags.i = 0)

  If OpenLibrary(0, "User32.dll")
   
    ; 'MsgBox' ist eine Variable mit einem 'ProtoMessageBoxA' Typ
    ;
    MsgBox.ProtoMessageBoxA = GetFunction(0, "MessageBoxA")
    
    MsgBox(0, "Hello", "World") ; wir geben keine Flags an
  EndIf