PureBasic

Import: EndImport


Синтаксис
Import "Filename"
  FunctionName.<type>(<parameter>, [, <parameter> [= DefaultValue]...]) [As "SymbolName"]
  ...
  VariableName.<type> [As "SymbolName"]
EndImport

Описание


Для опытных программистов. Командой Import: EndImport можно объявить функции и внешние переменные из файлов библиотеки (. Lib) или объектов (. Obj).

После объявления, импортированные функции становятся доступными для использования в программе, как любые другие команды. Компилятор не проверяет существование функции в импортированном файле, если встречается ошибка, об этом сообщит компоновщик.

Эта функция может заменить последовательность OpenLibrary()/CallFunction() поскольку она имеет ряд преимуществ: тип и количество параметров проверяется компилятором. Кроме того, в отличие от CallFunction(), импортируемые функции могут без проблем управлять типами double, float и quad.

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

По умолчанию, обозначение импортированной функции записывается следующим образом:_FunctionName @ callsize (имя функции и размер). Это должно работать в большинстве функций, которые используют стандартные вызовы (stdcall). Если библиотека является С, а функция не stdcall, то должен быть использован ImportC В этом случае, обозначение импортированной функции записывается следующим образом: _FunctionName (только имя функции).

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

Комментарии

На x64 есть только одно соглашение о вызовах, таким образом, ImportC будет вести себя семы как Import.

Пример

Import "User32.lib"

    ; Не нужно использовать 'As', п.ч. PureBasic декорирует функцию правильно
    ; Также мы определим параметр 'Flags' как необязательный, со значением по умолчанию 0 (когда пропущен)
    ;
    MessageBoxA(Window.i, Body$, Title$, Flags.i = 0)

    ; На этот раз PureBasic не может найти его сам, так как имя
    ; функции не то же, что используется символом
    ;
    MsgBox(Window.i, Body$, Title$, Flags.i) As "_MessageBoxA@16"

EndImport

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

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

Import "User32.lib"

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

EndImport
MessageBoxW(0, "Hello", "World")