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, аналогично тому, что делает pragmadynlib. Возвращает 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