2018-02-05 17:22:04 +03:00
|
|
|
|
<!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>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Команда загружает машинный код и инициализирует новые команды.</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +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>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<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
|
|
|
|
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Для безопасного интерпретатора имя процедуры должно быть
|
|
|
|
|
<em>pkg_SafeInit</em>. Эта функция должна быть написана очень
|
|
|
|
|
тщательно, чтобы позволить включить в безопасный интерпретатор
|
|
|
|
|
только те команды библиотеки, которые безопасны при
|
|
|
|
|
использовании в ненадежном коде. Дополнительная информация
|
|
|
|
|
приведена в п. <a href=SafeTcl.html><strong>Safe</strong></a>.</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Процедура инициализации должна соответствовать следующему
|
|
|
|
|
прототипу:</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
typedef int Tcl_PackageInitProc(Tcl_Interp *<em>interp</em>);
|
|
|
|
|
</pre>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<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>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
load bin/last.so {}
|
|
|
|
|
</pre>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<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>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
|