projman/hlp/ru/tcl/load.html
2018-02-05 17:23:37 +03:00

120 lines
8.5 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN>
<html>
<head>
<title>load</title>
</head>
<body>
<h1>load</h1>
<p>Команда загружает машинный код и инициализирует новые команды.</p>
<h2>СИНТАКСИС</h2>
<pre>
<strong>load</strong> <em>fileName</em>
<strong>load</strong> <em>fileName</em> <em>packageName</em>
<strong>load</strong> <em>fileName</em> <em>packageName</em> <em>interp</em>
</pre>
<h2>ОПИСАНИЕ</h2>
<p>Эта команда загружает двоичный код из файла в адресное
пространство приложения и вызывает инициализирующую процедуру
библиотеки, чтобы включить ее в интерпретатор. Аргумент
<em>fileName</em> есть имя файла, содержащего код. Конкретная
форма кода различна на разных платформах, но чаще всего он
должен быть разделяемой библиотекой, такой как <strong>.so-</strong>файлы
для Solaris и <strong>.dll</strong>-файлы для Windows. Аргумент
<em>packageName</em> есть имя библиотеки. Оно используется для
определения имени инициализационной процедуры. Аргумент
<em>interp</em> содержит имя интерпретатора (см. описание команды
<a href=interp.html><strong>interp</strong></a>). Если аргумент
<em>interp</em> не указан явно, то по умолчанию библиотека
загружается в текущий интерпретатор.</p>
<p>Как только файл загружен в адресное пространство приложения,
вызывается одна из двух процедур инициализации нового
кода. Обычно процедура инициализации добавляет в интерпретатор
новые Tcl-команды. Имя процедуры определяется исходя из имени
библиотеки и из того, является интерпретатор, в который будут
добавляться команды, безопасным (см. команду <a
href=interp.html><strong>interp</strong></a>). Для обычного
интерпретатора имя процедуры <em>pkg_Init</em>, где <em>pkg</em> -
имя библиотеки, преобразованное следующим образом: Первая буква
переведена в верхний регистр, а все остальные - в
нижний. Например, если имя библиотеки <strong>Foo</strong>, то имя
инициализационной процедуры должно быть <strong>Foo_Init</strong>.</p>
<p>Для безопасного интерпретатора имя процедуры должно быть
<em>pkg_SafeInit</em>. Эта функция должна быть написана очень
тщательно, чтобы позволить включить в безопасный интерпретатор
только те команды библиотеки, которые безопасны при
использовании в ненадежном коде. Дополнительная информация
приведена в п. <a href=SafeTcl.html><strong>Safe</strong></a>.</p>
<p>Процедура инициализации должна соответствовать следующему
прототипу:</p>
<pre>
typedef int Tcl_PackageInitProc(Tcl_Interp *<em>interp</em>);
</pre>
<p>Аргумент <em>interp</em> определяет интерпретатор, в который
библиотека будет загружена. Процедура инициализации должна
вернуть код <strong>TCL_OK</strong> или <strong>TCL_ERROR</strong> чтобы указать,
была ли она завершена успешно. В случае ошибки она должна
присвоить переменной <em>interp-&gt;result</em> значение указателя
на сообщение об ошибке. Результат процедуры инициализации будет
возвращен командой <strong>load</strong> как ее результат.</p>
<p>Реально каждый файл загружается в приложение только один
раз. Если команда <strong>load</strong> вызывается несколько раз, чтобы
загрузить один и тот же файл в различные интерпретаторы, то
реально загрузка кода выполняется только в первый раз. При
последующих вызовах будет выполняться только процедура
инициализации библиотеки в соответствующем интерпретаторе.
Выгрузить или повторно загрузить библиотеку невозможно.</p>
<p>Команда <strong>load</strong> также поддерживает библиотеки, статически
связанные с приложением, если они зарегистрированы с
использованием процедуры <strong>Tcl_StaticPackage</strong>. Если аргумент
<em>fileName</em> есть пустая строка, то необходимо указывать имя
библиотеки.</p>
<p>Если аргумент <em>packageName</em> отсутствует или равен пустой
строке, Tcl пытается сам сформировать имя библиотеки. На разных
платформах это выполняется по-разному. На Unix-платформах обычно
для этого берется последний элемент имени файла. Если первые три
буквы в нем - <strong>lib</strong>, то они отбрасываются. После чего
берутся все последовательные символы, которые являются буквами
или символом подчеркивания. Например, если имя файла
<strong>libxyz4.2.so</strong>, то в качестве имени библиотеки будет
сформировано <em>xyz</em>, а при исполнении команды</p>
<pre>
load bin/last.so {}
</pre>
<p>сформируется имя библиотеки <strong>last</strong>. Если аргумент
<em>fileName</em> равен пустой строке, то должен быть задан
аргумент <em>packageName</em>. Команда <strong>load</strong> в таком случае
ищет сначала статически загружаемую библиотеку (то есть,
библиотеку, зарегистрированную с помощью процедуры
<strong>Tcl_StaticPackage</strong>) с указанным именем. Если такая будет
найдена, то она используется в команде. В противном случае
ищется динамически загружаемая процедура с этим именем. Если
загружено несколько версий одной и той же библиотеки, то Tcl
выбирает ту, которая была загружена первой.</p>
<h2>ОШИБКИ</h2>
<p>Если одна и та же библиотека загружается несколько раз из
различных файлов, на некоторых платформах она будет загружена в
адресное пространство несколько раз.
</p>
</body>
</html>