\section{\module{dl} ---
         共有オブジェクトのC関数の呼び出し}
\declaremodule{extension}{dl}
  \platform{Unix} %?????????? Anyone????????????
\sectionauthor{Moshe Zadka}{moshez@zadka.site.co.il}
\modulesynopsis{共有オブジェクトのC関数の呼び出し}

\module{dl}モジュールは\cfunction{dlopen()}関数へのインターフェースを
定義します。
これはダイナミックライブラリにハンドルするための
\UNIX{}プラットフォーム上の最も一般的なインターフェースです。
そのライブラリの任意の関数を呼ぶプログラムを与えます。

\warning{\module{dl}モジュールはPythonの型システムとエラー処理をバイパス
しています。もし間違って使用すれば、セグメンテーションフォルト、
クラッシュ、その他の不正な動作を起こします。}

\note{このモジュールは\code{sizeof(int) == sizeof(long) == sizeof(char *)}
でなければ働きません。
そうでなければimportするときに\exception{SystemError}が送出されるでしょう。}

\module{dl}モジュールは次の関数を定義します:

\begin{funcdesc}{open}{name\optional{, mode\code{ = RTLD_LAZY}}}
共有オブジェクトファイルを開いて、ハンドルを返します。
モードは遅延結合(\constant{RTLD_LAZY})または即時結合(\constant{RTLD_NOW})
を表します。
デフォルトは\constant{RTLD_LAZY}です。
いくつかのシステムは\constant{RTLD_NOW}をサポートしていないことに
注意してください。

返り値は\class{dlobject}です。
\end{funcdesc}

\module{dl}モジュールは次の定数を定義します:

\begin{datadesc}{RTLD_LAZY}
\function{open()}の引数として使います。
\end{datadesc}

\begin{datadesc}{RTLD_NOW}
\function{open()}の引数として使います。
即時結合をサポートしないシステムでは、
この定数がモジュールに現われないことに注意してください。
最大のポータビリティを求めるならば、システムが即時結合をサポートする
かどうかを決定するために\function{hasattr()}を使用してください。
\end{datadesc}

\module{dl}モジュールは次の例外を定義します:

\begin{excdesc}{error}
動的なロードやリンクルーチンの内部でエラーが生じたときに送出される例外です。
\end{excdesc}

例:

\begin{verbatim}
>>> import dl, time
>>> a=dl.open('/lib/libc.so.6')
>>> a.call('time'), time.time()
(929723914, 929723914.498)
\end{verbatim}

この例はDebian GNU/Linuxシステム上で行なったもので、
このモジュールの使用はたいてい悪い選択肢であるという事実のよい例です。

\subsection{Dlオブジェクト \label{dl-objects}}
\function{open()}によって返されたDlオブジェクトは次のメソッドを持っています:

\begin{methoddesc}[dl]{close}{}
メモリーを除く全てのリソースを解放します。
\end{methoddesc}

\begin{methoddesc}[dl]{sym}{name}
\var{name}という名前の関数が参照された共有オブジェクトに存在する場合、
そのポインター(整数値)を返します。
存在しない場合\code{None}を返します。
これは次のように使えます:

\begin{verbatim}
>>> if a.sym('time'): 
...     a.call('time')
... else: 
...     time.time()
\end{verbatim}

(0は\NULL{}ポインターであるので、この関数は0でない数を返すだろう
ということに注意してください)
\end{methoddesc}

\begin{methoddesc}[dl]{call}{name\optional{, arg1\optional{, arg2\ldots}}}
参照された共有オブジェクトの\var{name}という名前の関数を呼出します。
引数は、Python整数(そのまま渡される)、Python文字列(ポインターが渡される)、
\code{None} (\NULL{}として渡される) のどれかでなければいけません。
Pythonはその文字列が変化させられるのを好まないので、
文字列は\ctype{const char*}として関数に渡されるべきであることに
注意してください。

最大で10個の引数が渡すことができ、
与えられない引数は\code{None}として扱われます。
関数の返り値はC \ctype{long}(Python整数である)です。
\end{methoddesc}
