load.n
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:7k
源码类别:

通讯编程

开发平台:

Visual C++

  1. '"
  2. '" Copyright (c) 1995-1996 Sun Microsystems, Inc.
  3. '"
  4. '" See the file "license.terms" for information on usage and redistribution
  5. '" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  6. '" 
  7. '" RCS: @(#) $Id: load.n,v 1.7.2.2 2007/09/20 16:24:46 dgp Exp $
  8. '" 
  9. .so man.macros
  10. .TH load n 7.5 Tcl "Tcl Built-In Commands"
  11. .BS
  12. '" Note:  do not modify the .SH NAME line immediately below!
  13. .SH NAME
  14. load - Load machine code and initialize new commands.
  15. .SH SYNOPSIS
  16. fBload fIfileNamefR
  17. .br
  18. fBload fIfileName packageNamefR
  19. .br
  20. fBload fIfileName packageName interpfR
  21. .BE
  22. .SH DESCRIPTION
  23. .PP
  24. This command loads binary code from a file into the
  25. application's address space and calls an initialization procedure
  26. in the package to incorporate it into an interpreter.  fIfileNamefR
  27. is the name of the file containing the code;  its exact form varies
  28. from system to system but on most systems it is a shared library,
  29. such as a fB.sofR file under Solaris or a DLL under Windows.
  30. fIpackageNamefR is the name of the package, and is used to
  31. compute the name of an initialization procedure.
  32. fIinterpfR is the path name of the interpreter into which to load
  33. the package (see the fBinterpfR manual entry for details);
  34. if fIinterpfR is omitted, it defaults to the
  35. interpreter in which the fBloadfR command was invoked.
  36. .PP
  37. Once the file has been loaded into the application's address space,
  38. one of two initialization procedures will be invoked in the new code.
  39. Typically the initialization procedure will add new commands to a
  40. Tcl interpreter.
  41. The name of the initialization procedure is determined by
  42. fIpackageNamefR and whether or not the target interpreter
  43. is a safe one.  For normal interpreters the name of the initialization
  44. procedure will have the form fIpkgfB_InitfR, where fIpkgfR
  45. is the same as fIpackageNamefR except that the first letter is
  46. converted to upper case and all other letters
  47. are converted to lower case.  For example, if fIpackageNamefR is
  48. fBfoofR or fBFOofR, the initialization procedure's name will
  49. be fBFoo_InitfR.
  50. .PP
  51. If the target interpreter is a safe interpreter, then the name
  52. of the initialization procedure will be fIpkgfB_SafeInitfR
  53. instead of fIpkgfB_InitfR.
  54. The fIpkgfB_SafeInitfR function should be written carefully, so that it
  55. initializes the safe interpreter only with partial functionality provided
  56. by the package that is safe for use by untrusted code. For more information
  57. on Safe-Tcl, see the fBsafefR manual entry.
  58. .PP
  59. The initialization procedure must match the following prototype:
  60. .CS
  61. typedef int Tcl_PackageInitProc(Tcl_Interp *fIinterpfR);
  62. .CE
  63. The fIinterpfR argument identifies the interpreter in which the
  64. package is to be loaded.  The initialization procedure must return
  65. fBTCL_OKfR or fBTCL_ERRORfR to indicate whether or not it completed
  66. successfully;  in the event of an error it should set the interpreter's result
  67. to point to an error message.  The result of the fBloadfR command
  68. will be the result returned by the initialization procedure.
  69. .PP
  70. The actual loading of a file will only be done once for each fIfileNamefR
  71. in an application.  If a given fIfileNamefR is loaded into multiple
  72. interpreters, then the first fBloadfR will load the code and
  73. call the initialization procedure;  subsequent fBloadfRs will
  74. call the initialization procedure without loading the code again.
  75. It is not possible to unload or reload a package.
  76. .PP
  77. The fBloadfR command also supports packages that are statically
  78. linked with the application, if those packages have been registered
  79. by calling the fBTcl_StaticPackagefR procedure.
  80. If fIfileNamefR is an empty string, then fIpackageNamefR must
  81. be specified.
  82. .PP
  83. If fIpackageNamefR is omitted or specified as an empty string,
  84. Tcl tries to guess the name of the package.
  85. This may be done differently on different platforms.
  86. The default guess, which is used on most UNIX platforms, is to
  87. take the last element of fIfileNamefR, strip off the first
  88. three characters if they are fBlibfR, and use any following
  89. .VS
  90. alphabetic and underline characters as the module name.
  91. .VE
  92. For example, the command fBload libxyz4.2.sofR uses the module
  93. name fBxyzfR and the command fBload bin/last.so {}fR uses the
  94. module name fBlastfR.
  95. .VS "" br
  96. .PP
  97. If fIfileNamefR is an empty string, then fIpackageNamefR must
  98. be specified.
  99. The fBloadfR command first searches for a statically loaded package
  100. (one that has been registered by calling the fBTcl_StaticPackagefR
  101. procedure) by that name; if one is found, it is used.
  102. Otherwise, the fBloadfR command searches for a dynamically loaded
  103. package by that name, and uses it if it is found.  If several
  104. different files have been fBloadfRed with different versions of
  105. the package, Tcl picks the file that was loaded first.
  106. .VE
  107. .SH "PORTABILITY ISSUES"
  108. .TP
  109. fBWindowsfR
  110. .
  111. When a load fails with "library not found" error, it is also possible
  112. that a dependent library was not found.  To see the dependent libraries,
  113. type ``dumpbin -imports <dllname>'' in a DOS console to see what the
  114. library must import.
  115. When loading a DLL in the current directory, Windows will ignore ``./'' as
  116. a path specifier and use a search heuristic to find the DLL instead.
  117. To avoid this, load the DLL with:
  118. .CS
  119. fBloadfR [file join [pwd] mylib.DLL]
  120. .CE
  121. .SH BUGS
  122. .PP
  123. If the same file is fBloadfRed by different fIfileNamefRs, it will
  124. be loaded into the process's address space multiple times.  The
  125. behavior of this varies from system to system (some systems may
  126. detect the redundant loads, others may not).
  127. .SH EXAMPLE
  128. The following is a minimal extension:
  129. .PP
  130. .CS
  131. #include <tcl.h>
  132. #include <stdio.h>
  133. static int fooCmd(ClientData clientData,
  134.         Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) {
  135.     printf("called with %d arguments\n", objc);
  136.     return TCL_OK;
  137. }
  138. int Foo_Init(Tcl_Interp *interp) {
  139.     if (Tcl_InitStubs(interp, "8.1", 0) == NULL) {
  140. return TCL_ERROR;
  141.     }
  142.     printf("creating foo command");
  143.     Tcl_CreateObjCommand(interp, "foo", fooCmd, NULL, NULL);
  144.     return TCL_OK;
  145. }
  146. .CE
  147. .PP
  148. When built into a shared/dynamic library with a suitable name
  149. (e.g. fBfoo.dllfR on Windows, fBlibfoo.sofR on Solaris and Linux)
  150. it can then be loaded into Tcl with the following:
  151. .PP
  152. .CS
  153. # Load the extension
  154. switch $tcl_platform(platform) {
  155.    windows {
  156.       fBloadfR [file join [pwd] foo.dll]
  157.    }
  158.    unix {
  159.       fBloadfR [file join [pwd] libfoo[info sharedlibextension]]
  160.    }
  161. }
  162. # Now execute the command defined by the extension
  163. foo
  164. .CE
  165. .SH "SEE ALSO"
  166. info sharedlibextension, Tcl_StaticPackage(3), safe(n)
  167. .SH KEYWORDS
  168. binary code, loading, safe interpreter, shared library