projman/hlp/ru/tcl/load.html

120 lines
8.5 KiB
HTML
Raw Normal View History

<!DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN>
2015-10-19 13:27:31 +03:00
<html>
<head>
<title>load</title>
</head>
<body>
<h1>load</h1>
<p>Команда загружает машинный код и инициализирует новые команды.</p>
2015-10-19 13:27:31 +03:00
<h2>СИНТАКСИС</h2>
2015-10-19 13:27:31 +03:00
<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>
2015-10-19 13:27:31 +03:00
<p>Для безопасного интерпретатора имя процедуры должно быть
<em>pkg_SafeInit</em>. Эта функция должна быть написана очень
тщательно, чтобы позволить включить в безопасный интерпретатор
только те команды библиотеки, которые безопасны при
использовании в ненадежном коде. Дополнительная информация
приведена в п. <a href=SafeTcl.html><strong>Safe</strong></a>.</p>
2015-10-19 13:27:31 +03:00
<p>Процедура инициализации должна соответствовать следующему
прототипу:</p>
2015-10-19 13:27:31 +03:00
<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>
2015-10-19 13:27:31 +03:00
<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>Если одна и та же библиотека загружается несколько раз из
различных файлов, на некоторых платформах она будет загружена в
адресное пространство несколько раз.
2015-10-19 13:27:31 +03:00
</p>
</body>
</html>