Spec-Zone.ru › Nim

std/dynlib

Source Edit

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

Примеры

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

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

Пример:

import std/dynlib
type
  GreetFunction = proc (): cstring {.gcsafe, stdcall.}

proc loadGreet(lang: string) =
  let lib =
    case lang
    of "french":
      loadLib("french.dll")
    else:
      loadLib("english.dll")
  assert lib != nil, "Error loading library"

  let greet = cast[GreetFunction](lib.symAddr("greet"))
  assert greet != nil, "Error loading 'greet' function from library"

  echo greet()

  unloadLib(lib)

Импорты

strutils

Типы

LibHandle = pointer
Дескриптор динамически загруженной библиотеки. Source Edit

Процедуры

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

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

Spec-Zone.ru

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