load -
マシンコードをロードし、新しいコマンドを初期化します。
- load fileName
- load fileName packageName
- load fileName packageName interp
本コマンドはバイナリコードをファイルからアプリケーションのアドレススペースにロードし、インタプリタに取り込むためにパッケージ内の初期化プロシージャを呼び出します。
fileName
はコードが含まれるファイル名です。その厳密なフォーマットはシステムによって様々ですが、ほとんどのシステムおいてSolaris環境の.soファイルやWindows環境のDLLのような共有ライブラリです。
packageName
はパッケージ名であり、初期化プロシージャの名前を導出するために使われます。
interp はパッケージをロードするインタプリタのパス名です(詳細は
interpのマニュアルを参照)。interp が省略される場合、load
コマンドが呼び出されたインタプリタがデフォルトとなります。
ファイルがいったんアプリケーションのアドレススペースにロードされると2つの初期化プロシージャのうちの1つが新しいコードで呼び出されます。
一般的に初期化プロシージャはTclのインタプリタに新しいコマンドを付け加えます。
初期化プロシージャの名前はpackageNameとターゲットインタプリタが安全なものであるかどうかで決まます。普通
のインタプリタでは初期 化プロシージャはpkg_Initという形式を持ちます。pkgはpackageNameの最初の文字を大文字にし、他の文字をすべて小文字にしたものです。
例えば、packageNameがfooかFOoだとすると、初期化プロシージャの名前はFoo_Initとなります。
ターゲットインタプリタが安全なインタプリタなら初期化プロシージャの名前は
pkg_Initのかわりにpkg_SafeInitとなります。 pkg_SafeInit関数は慎重に書かれなければなりません。信用されないコードを使うためにパッケージで提供される安全で部分的な機能のみインタプ
リタを初期化します。 Safe-Tclに関する詳細情報は safe
マニュアルを参照してください。
初期化プロシージャは以下のプロトタイプにマッチしなければなりません。
typedef int Tcl_PackageInitProc(Tcl_Interp *interp);
interp引数はパッケージがロードされるインタプリタを示します。初期化プロシージャは完了したかどうかを示すためにTCL_OKかTCL_ERRORのいずれかを返します。エラーの場合はインタープリタの結果
をエラーメッセージを示すものに設定されます。loadコマンドの結果は初期化プロシージャによって返された結果
です。
アプリケーションで各fileNameにつき、実際のファイルのロードはただ1度行われます。与えられたfileName
が複数のインタプリタにロードされる場合、最初のloadはコードをロードし、初期化プロシージャを呼び出します。
後続のloadは再びコードをロードせず、初期化プロシージャを呼び出すだけです。パッケージをアンロードやリロードすることは不可能です。
また、load
コマンドはアプリケーションに静的にリンクされたパッケージもサポー
トします。 これらのパッケージが Tcl_StaticPackageプロシージャの呼び出しにより登録されていることは条件です。
fileName が空文字列の場合、packageNameは必ず指定しなければなりません。
packageNameが省略されるか空文字列に指定される場合、Tclはパッケージの名前を推測します。これは異なるプラットホームで異なった方法で行われます。ほとんどのUNIXプラットホームに使われるデフォルト推測は、fileNameの最後の要素をとり、最初の3文字がlibならそれを取除き、後続する残ったアルファベットと下線の文字をモジュールの名前として使用します。例えば、load
libxyz4.2.so コマンドはモジュール名 xyzを使用し、 load
bin/last.so {} コマンドはモジュール名lastを使用します。
fileNameが空文字列ならば、packageNameは必ず指定しなければなりません。
loadコマンドは最初にこの名前で静的にロードされたパッケージを検索します(Tcl_StaticPackageプロシージャの呼出しにより登
録されている)。見つかればそれが使われます。見つからなければ、loadコマンドはその名前で動的にロードされたパッケージを検索します。見つかればそれが使われます。同じパッケージの異なるバージョンのファイルがロードされていた場合、
Tcl は先にロードされたファイルを選びます。
- Windows
- ロードが”library not found”エラーで失敗でするとき、依存するライブラリが発見されなかった可能性もあります。依存のライブラリを確認するには、DOSコンソールにおいて"dumpbin
-imports <dllname>"を入力し、何のライブラリをimportすべきかを確認したほうがよいでしょう。現在のディレクトリにDLLをロードするとき、Windows
はパス記述子として"./"を無視して、その代りに独自の検索を使ってDLLを見つけようとします。これを避けるために、DLLをロードするには、
load [file join [pwd] mylib.DLL]
- を使います。
同じファイルが異なるfileNamesでロードされる場合、プロセスのアドレススペースに何回もロードされてしまいます。この処理はシステムにより異なります(いくつかのシステムは余分なロードを検知できますが、しないものもあります)。
info sharedlibextension, Tcl_StaticPackage, safe
binary code, loading, safe
interpreter, shared library
Copyright © 1995-1996 Sun Microsystems, Inc.
Copyright © 1995-1997 Roger E. Critchlow Jr.
|