'\" '\" Copyright (c) 1995-1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: load.n,v 1.2 2003/11/24 05:09:59 bbbush Exp $ '\" '\" The definitions below are for supplemental macros used in Tcl/Tk '\" manual entries. '\" '\" .AP type name in/out ?indent? '\" Start paragraph describing an argument to a library procedure. '\" type is type of argument (int, etc.), in/out is either "in", "out", '\" or "in/out" to describe whether procedure reads or modifies arg, '\" and indent is equivalent to second arg of .IP (shouldn't ever be '\" needed; use .AS below instead) '\" '\" .AS ?type? ?name? '\" Give maximum sizes of arguments for setting tab stops. Type and '\" name are examples of largest possible arguments that will be passed '\" to .AP later. If args are omitted, default tab stops are used. '\" '\" .BS '\" Start box enclosure. From here until next .BE, everything will be '\" enclosed in one large box. '\" '\" .BE '\" End of box enclosure. '\" '\" .CS '\" Begin code excerpt. '\" '\" .CE '\" End code excerpt. '\" '\" .VS ?version? ?br? '\" Begin vertical sidebar, for use in marking newly-changed parts '\" of man pages. The first argument is ignored and used for recording '\" the version when the .VS was added, so that the sidebars can be '\" found and removed when they reach a certain age. If another argument '\" is present, then a line break is forced before starting the sidebar. '\" '\" .VE '\" End of vertical sidebar. '\" '\" .DS '\" Begin an indented unfilled display. '\" '\" .DE '\" End of indented unfilled display. '\" '\" .SO '\" Start of list of standard options for a Tk widget. The '\" options follow on successive lines, in four columns separated '\" by tabs. '\" '\" .SE '\" End of list of standard options for a Tk widget. '\" '\" .OP cmdName dbName dbClass '\" Start of description of a specific option. cmdName gives the '\" option's name as specified in the class command, dbName gives '\" the option's name in the option database, and dbClass gives '\" the option's class in the option database. '\" '\" .UL arg1 arg2 '\" Print arg1 underlined, then print arg2 normally. '\" '\" RCS: @(#) $Id: load.n,v 1.2 2003/11/24 05:09:59 bbbush Exp $ '\" '\" # Set up traps and other miscellaneous stuff for Tcl/Tk man pages. .if t .wh -1.3i ^B .nr ^l \n(.l .ad b '\" # Start an argument description .de AP .ie !"\\$4"" .TP \\$4 .el \{\ . ie !"\\$2"" .TP \\n()Cu . el .TP 15 .\} .ta \\n()Au \\n()Bu .ie !"\\$3"" \{\ \&\\$1 \\fI\\$2\\fP (\\$3) .\".b .\} .el \{\ .br .ie !"\\$2"" \{\ \&\\$1 \\fI\\$2\\fP .\} .el \{\ \&\\fI\\$1\\fP .\} .\} .. '\" # define tabbing values for .AP .de AS .nr )A 10n .if !"\\$1"" .nr )A \\w'\\$1'u+3n .nr )B \\n()Au+15n .\" .if !"\\$2"" .nr )B \\w'\\$2'u+\\n()Au+3n .nr )C \\n()Bu+\\w'(in/out)'u+2n .. .AS Tcl_Interp Tcl_CreateInterp in/out '\" # BS - start boxed text '\" # ^y = starting y location '\" # ^b = 1 .de BS .br .mk ^y .nr ^b 1u .if n .nf .if n .ti 0 .if n \l'\\n(.lu\(ul' .if n .fi .. '\" # BE - end boxed text (draw box now) .de BE .nf .ti 0 .mk ^t .ie n \l'\\n(^lu\(ul' .el \{\ .\" Draw four-sided box normally, but don't draw top of .\" box if the box started on an earlier page. .ie !\\n(^b-1 \{\ \h'-1.5n'\L'|\\n(^yu-1v'\l'\\n(^lu+3n\(ul'\L'\\n(^tu+1v-\\n(^yu'\l'|0u-1.5n\(ul' .\} .el \}\ \h'-1.5n'\L'|\\n(^yu-1v'\h'\\n(^lu+3n'\L'\\n(^tu+1v-\\n(^yu'\l'|0u-1.5n\(ul' .\} .\} .fi .br .nr ^b 0 .. '\" # VS - start vertical sidebar '\" # ^Y = starting y location '\" # ^v = 1 (for troff; for nroff this doesn't matter) .de VS .if !"\\$2"" .br .mk ^Y .ie n 'mc \s12\(br\s0 .el .nr ^v 1u .. '\" # VE - end of vertical sidebar .de VE .ie n 'mc .el \{\ .ev 2 .nf .ti 0 .mk ^t \h'|\\n(^lu+3n'\L'|\\n(^Yu-1v\(bv'\v'\\n(^tu+1v-\\n(^Yu'\h'-|\\n(^lu+3n' .sp -1 .fi .ev .\} .nr ^v 0 .. '\" # Special macro to handle page bottom: finish off current '\" # box/sidebar if in box/sidebar mode, then invoked standard '\" # page bottom macro. .de ^B .ev 2 'ti 0 'nf .mk ^t .if \\n(^b \{\ .\" Draw three-sided box if this is the box's first page, .\" draw two sides but no top otherwise. .ie !\\n(^b-1 \h'-1.5n'\L'|\\n(^yu-1v'\l'\\n(^lu+3n\(ul'\L'\\n(^tu+1v-\\n(^yu'\h'|0u'\c .el \h'-1.5n'\L'|\\n(^yu-1v'\h'\\n(^lu+3n'\L'\\n(^tu+1v-\\n(^yu'\h'|0u'\c .\} .if \\n(^v \{\ .nr ^x \\n(^tu+1v-\\n(^Yu \kx\h'-\\nxu'\h'|\\n(^lu+3n'\ky\L'-\\n(^xu'\v'\\n(^xu'\h'|0u'\c .\} .bp 'fi .ev .if \\n(^b \{\ .mk ^y .nr ^b 2 .\} .if \\n(^v \{\ .mk ^Y .\} .. '\" # DS - begin display .de DS .RS .nf .sp .. '\" # DE - end display .de DE .fi .RE .sp .. '\" # SO - start of list of standard options .de SO .SH "STANDARD OPTIONS" .LP .nf .ta 5.5c 11c .ft B .. '\" # SE - end of list of standard options .de SE .fi .ft R .LP See the \\fBoptions\\fR manual entry for details on the standard options. .. '\" # OP - start of full description for a single option .de OP .LP .nf .ta 4c Command-Line Name: \\fB\\$1\\fR Database Name: \\fB\\$2\\fR Database Class: \\fB\\$3\\fR .fi .IP .. '\" # CS - begin code excerpt .de CS .RS .nf .ta .25i .5i .75i 1i .. '\" # CE - end code excerpt .de CE .fi .RE .. .de UL \\$1\l'|0\(ul'\\$2 .. .TH load 3tcl 7.5 Tcl "Tcl Built-In Commands" .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME load \- 裝載機器程式碼並初始化新命令。 .SH "總覽 SYNOPSIS" \fBload \fIfileName\fR .br \fBload \fIfileName packageName\fR .br \fBload \fIfileName packageName interp\fR .BE .SH "描述 DESCRIPTION" .PP 這個命令把二進位制程式碼從一個檔案裝載到應用的地址空間中並呼叫在包(package)中的初始化過程來把它加入到直譯器中。\fIfileName\fR 是包含程式碼的檔案的名字;它準確的形式在不同的系統上是不同的,但在多數系統上是一個共享庫,例如,在 Solaris 下的 \fB.so\fR 檔案或在 Windows 下的一個 DLL。\fIpackageName\fR 是包的名字,並被用於計算初始化過程的名字。\fIinterp\fR 是要在其中裝載包的直譯器的路徑名(詳情參見 \fBinterp\fR 手冊條目);如果省略了 \fIinterp\fR ,它的預設是在其中呼叫 \fBload \fR命令的那個直譯器。 .PP 一旦已經被裝載到應用的地址空間中,兩個初始化過程之一將在新程式碼中被呼叫。典型的,初始化程序將向一個 Tcl 直譯器新增新命令。初始化過程的名字由 \fIpackageName\fR 和目標直譯器是否是安全直譯器來確定。對於通常的直譯器,初始化過程的名字的形式是 \fIpkg\fR\fB_Init\fR,這裡 \fIpkg\fR 與 \fIpackageName\fR 相同,但是第一個字母被轉換成大寫而所有其他字母被轉換成小寫。例如,如果 \fIpackageName\fR 是 \fBfoo\fR 或 \fBFOo\fR,則初始化過程的名字將是 \fBFoo_Init\fR。 .PP 如果目標直譯器是一個安全直譯器,則初始化過程的名字將是 \fIpkg\fR\fB_SafeInit\fR 而不是 \fIpkg\fR\fB_Init\fR。寫 \fIpkg\fR\fB_SafeInit\fR 函式要仔細,在包中提供的功能中,只用由不可信任的程式碼使用是安全的的那部分初始化安全直譯器。 關於 Safe-Tcl 的詳細的資訊,請參見 \fBsafe\fR 手冊條目。 .PP 初始化過程必須匹配下列原型 (prototype): .CS typedef int Tcl_PackageInitProc(Tcl_Interp *\fIinterp\fR); .CE \fIinterp\fR 引數標識在其中裝載包的直譯器。初始化過程必須返回 \fBTCL_OK\fR 或 \fBTCL_ERROR\fR 來指示是否成功完成;在有錯誤的情況下,應把直譯器的結果設定為指向一個錯誤訊息。初始化過程返回的結果就是 \fBload\fR 命令的結果。 .PP 在一個應用中對每個 \fIfileName \fR只進行一次檔案的實際裝載。如果一個給定的 \fIfileName\fR 被裝載到多個直譯器中,則第一個 \fBload\fR 將裝載程式碼並呼叫初始化過程;隨後的 \fBload\fR 將呼叫初始化過程而不再次裝載程式碼 。不可能解除安裝或過載一個包。 .PP \fBload\fR 命令還支援同應用靜態連線的包,條件是這些包已經透過呼叫 \fBTcl_StaticPackage\fR 過程註冊過了。如果 \fIfileName\fR 是一個空串,則必須指定\fIpackageName\fR 。 .PP 如果省略了 \fIpackageName\fR 或被指定為一個空串,Tcl 嘗試著猜出包的名字。在不同的平臺上可能是不同的。在多數 UNIX 平臺上,預設的猜測是接受 \fIfileName\fR 的最後的組成部分,如果前三個字元是 \fBlib \fR就去掉它們,使用所有隨後的 .VS 字母和下劃線作為模組的名字。 .VE 例如,命令 \fBload libxyz4.2.so\fR 使用模組名 \fBxyz\fR 而命令 \fBload bin/last.so {}\fR 使用模組名 \fBlast\fR。 .VS "" br .PP 如果 \fIfileName\fR 是一個空串,則必須指定 \fIpackageName\fR。\fBload\fR 命令首先用這個名字查詢一個靜態裝載包(透過呼叫 \fBTcl_StaticPackage\fR 過程註冊的包);如果找到了就使用它。否則,\fBload\fR 命令用這個名字查詢動態裝載包,如果找到就使用它。如果一些不同的檔案被裝載成包的不同版本,Tcl 選擇被最先裝載的檔案。 .VE .SH "移植要點 PORTABILITY ISSUES" .TP \fBWindows\fR\0\0\0\0\0 . 在裝載出現 "library not found" 錯誤的時候,也有可能是沒找到一個依賴庫。要檢視依賴庫,在一個 DOS 控制檯中“dumpbin -imports ”來檢視必須匯入那些庫。在當前目錄中裝載一個 DLL 的時候,Windows 將忽略作為一個路徑指定符(specifier)的“./”,轉而使用一次啟發式(heuristic)的查詢來找到這個 DLL。要避免如此,裝載DLL 就要用 .CS load [file join [pwd] mylib.DLL] .CE .SH BUGS .PP 如果以不同的\fIfileName\fRs 裝載同一個檔案,它將被多次載入這個程序的地址空間。在不同的系統上裝載的行為是不同的(一些系統可以檢測多餘的裝載,其他的可能不能)。 .SH "參見 SEE ALSO" \fBinfo sharedlibextension\fR, Tcl_StaticPackage(3), safe(n) .SH "關鍵字 KEYWORDS" binary code, loading, safe interpreter, shared library .SH "[中文版維護人]" .B 寒蟬退士 .SH "[中文版最新更新]" .B 2001/08/30 .SH "《中國 Linux 論壇 man 手冊頁翻譯計劃》:" .BI http://cmpp.linuxforum.net .SH "跋" .br 本頁面中文版由中文 man 手冊頁計劃提供。 .br 中文 man 手冊頁計劃:\fBhttps://github.com/man-pages-zh/manpages-zh\fR