<!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>