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