PureBasic

Прототипы


Синтаксис
Prototype.<type> name(<parameter>, [, <parameter> [= DefaultValue]...])

Описание


Для опытных программистов. Prototype позволяет объявить тип, который отобразит функцию. Это позволяет создать указатели на функции, так как этот тип может быть указан для переменной, значение которой будет адресом вызываемой функции и может изменяться по желанию).

Эта функция может заменить последовательность OpenLibrary() и CallFunction() , так как у нее есть несколько преимуществ: происходит проверка типа параметра и количество параметров.

В отличие от CallFunction(), прототип может управлять параметрами переменных типа double, float и quad. GetFunction() позволяет получить указатель функции, в любой библиотеке.

У нескольких из последних параметров процедуры могут быть значения по умолчанию (должно быть выражение как константное), поэтому если эти параметры будут опущены при вызове процедуры, будет использоваться значение по умолчанию.

По умолчанию, функция использует соглашение (stdcall). Если указатель функции вызывает функцию C использующую соглашение (Cdecl), то вместо этого должен использоваться PrototypeC

Псевдотипы могут использоваться для параметров, но не для возвращаемого значения.

Пример

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

If OpenLibrary(0, "User32.dll")

    ; 'MsgBox' - переменная с типом 'ProtoMessageBox'
    ;
    MsgBox.ProtoMessageBox = GetFunction(0, "MessageBoxA")

    MsgBox(0, "Hello", "World") ; Мы не определяем флаги
EndIf

Пример: С псевдотипами

; Мы используем 'p-unicode'  псевдотип для строковых параметров, так как
; MessageBoxW() является функцией поддерживающей только unicode.
; Компилятор автоматически преобразует строки в unicode при необходимости.
;
Prototype.i ProtoMessageBoxW(Window.i, Body.p-unicode, Title.p-unicode, Flags.i = 0)

If OpenLibrary(0, "User32.dll")

    ; 'MsgBox' - переменная с типом 'ProtoMessageBoxW'
    ;
    MsgBox.ProtoMessageBoxW = GetFunction(0, "MessageBoxW")

    MsgBox(0, "Hello", "World") ; Мы не определяем флаги
EndIf