120 lines
8.5 KiB
HTML
120 lines
8.5 KiB
HTML
<!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->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>
|
||
|