Spec-Zone.ru › Nim 1

dynlib

Этот модуль реализует возможность доступа к символам из динамически подключаемых библиотек. В POSIX используется механизм dlsym, в Windows LoadLibrary.

Примеры

Загрузка простой C-функции

Следующий пример демонстрирует загрузку функции 'greet' из библиотеки, имя которой определяется во время выполнения на основе выбора языка. Если библиотека не загружается или функция 'greet' не найдена, выполнение завершается с ошибкой.

import dynlib

type
  greetFunction = proc(): cstring {.gcsafe, stdcall.}

let lang = stdin.readLine()

let lib = case lang
of "french":
  loadLib("french.dll")
else:
  loadLib("english.dll")

if lib == nil:
  echo "Error loading library"
  quit(QuitFailure)

let greet = cast[greetFunction](lib.symAddr("greet"))

if greet == nil:
  echo "Error loading 'greet' function from library"
  quit(QuitFailure)

let greeting = greet()

echo greeting

unloadLib(lib)

Импорты

strutils, posix

Типы

LibHandle = pointer
дескриптор динамически загруженной библиотеки Исходный код Редактировать

Процедуры

proc raiseInvalidLibrary(name: cstring) {...}{.noinline, noreturn,
    raises: [LibraryError], tags: [].}
вызывает исключение EInvalidLibrary. Исходный код Редактировать
proc checkedSymAddr(lib: LibHandle; name: cstring): pointer {...}{.
    raises: [Exception, LibraryError], tags: [RootEffect].}
извлекает адрес процедуры/переменной из lib. Вызывает EInvalidLibrary, если символ не найден. Исходный код Редактировать
proc libCandidates(s: string; dest: var seq[string]) {...}{.raises: [], tags: [].}
по заданному шаблону имени библиотеки s записывает возможные имена библиотек в dest. Исходный код Редактировать
proc loadLibPattern(pattern: string; globalSymbols = false): LibHandle {...}{.
    raises: [Exception], tags: [RootEffect].}
загружает библиотеку, имя которой соответствует pattern, аналогично тому, что делает pragma dynlib. Возвращает nil, если библиотека не может быть загружена. Предупреждение: эта процедура использует сборщик мусора и поэтому не может использоваться для загрузки сборщика мусора. Исходный код Редактировать
proc loadLib(path: string; globalSymbols = false): LibHandle {...}{.gcsafe,
    raises: [], tags: [].}
загружает библиотеку из path. Возвращает nil, если библиотека не может быть загружена. Исходный код Редактировать
proc loadLib(): LibHandle {...}{.gcsafe, raises: [], tags: [].}
получает дескриптор текущего исполняемого файла. Возвращает nil, если библиотека не может быть загружена. Исходный код Редактировать
proc unloadLib(lib: LibHandle) {...}{.gcsafe, raises: [], tags: [].}
выгружает библиотеку lib Исходный код Редактировать
proc symAddr(lib: LibHandle; name: cstring): pointer {...}{.gcsafe, raises: [],
    tags: [].}
извлекает адрес процедуры/переменной из lib. Возвращает nil, если символ не найден. Исходный код Редактировать

© 2006–2021 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/dynlib.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API