###
2 共有ライブラリをロードする

共有ライブラリをPythonプロセスへロードする方法はいくつかあります。 一つの方法は下記のクラスの一つをインスタンス化することです:

クラス `CDLL`( | name, mode=DEFAULT_MODE, handle=None)

  このクラスのインスタンスはロードされた共有ライブラリをあらわします。 これらのライブラリの関数は標準 C 呼び出し規約を使用し、 `int`を返すと仮定されます。

クラス `OleDLL`( | name, mode=DEFAULT_MODE, handle=None)

  Windows用: このクラスのインスタンスはロードされた共有ライブラリを あらわします。これらのライブラリの関数は`stdcall`呼び出し規約を使用し、 windows固有の`HRESULT`コードを返すと仮定されます。 `HRESULT`値には関数呼び出しが失敗したのか成功したのかを 特定する情報とともに、補足のエラーコードが含まれます。 戻り値が失敗を知らせたならば、`WindowsError`が自動的に 発生します。

クラス `WinDLL`( | name, mode=DEFAULT_MODE, handle=None)

  Windows用: このクラスのインスタンスはロードされた共有ライブラリを あらわします。これらのライブラリの関数は`stdcall`呼び出し規約を使用し、 デフォルトでは`int`を返すと仮定されます。

  Windows CEでは標準呼び出し規約だけが使われます。便宜上、 このプラットホームでは、`WinDLL`と`OleDLL`が 標準呼び出し規約を使用します。

これらのライブラリがエクスポートするどの関数でも呼び出す前に Python GIL は解放され、後でまた必要になります。

クラス `PyDLL`( | name, mode=DEFAULT_MODE, handle=None)

  Python GILが関数呼び出しの間解放されず、関数実行の後にPython エラーフラグが チェックされるということを除けば、このクラスのインスタンスは `CDLL`インスタンスのように振る舞います。エラーフラグがセットされた場合、 Python 例外が発生します。

  要するに、これはPython C api関数を直接呼び出すのに便利だというだけです。

これらすべてのクラスは少なくとも一つの引数、すなわちロードする共有ライブラリの パスを渡して呼び出すことでインスタンス化されます。すでにロード済みの 共有ライブラリへのハンドルがあるなら、`handle`名前付き引数として 渡すことができます。土台となっているプラットホームの`dlopen`または `LoadLibrary`関数がプロセスへライブラリをロードするために使われ、 そのライブラリに対するハンドルを得ます。

modeパラメータはライブラリがどうやってロードされたかを特定するために 使うことができます。詳細は、`dlopen(3)`マニュアルページを参考にしてください。 Windowsではmodeは無視されます。

`RTLD_GLOBAL`
  modeパラメータとして使うフラグ。このフラグが利用できないプラットホームでは、 整数のゼロと定義されています。

`RTLD_LOCAL`
  modeパラメータとして使うフラグ。これが利用できないプラットホームでは、 RTLD_GLOBALと同様です。

`DEFAULT_MODE`
  共有ライブラリをロードするために使われるデフォルトモード。 OSX 10.3ではRTLD_GLOBALであり、そうでなければ RTLD_LOCALと同じです。

これらのクラスのインスタンスには公開メソッドがありません。けれども、 `__getattr__`と`__getitem__`は 特別ははたらきをします。その共有ライブラリがエクスポートする関数に 添字を使って属性としてアクセスできるのです。`__getattr__`と `__getitem__`のどちらもが結果をキャッシュし、 そのため常に同じオブジェクトを返すことに注意してください。

次に述べる公開属性が利用できます。それらの名前はエクスポートされた関数名に 衝突しないように下線で始まります:

`_handle`
  ライブラリへのアクセスに用いられるシステムハンドル。

`_name`
  コンストラクタに渡されたライブラリの名前。

共有ライブラリは(`LibraryLoader`クラスのインスタンスである) 前もって作られたオブジェクトの一つを使うことによってロードすることもできます。 それらの`LoadLibrary`メソッドを呼び出すか、ローダーインスタンスの属性として ライブラリを取り出すかのどちらかによりロードします。

クラス `LibraryLoader`( | dlltype)

  共有ライブラリをロードするクラス。`dlltype`は`CDLL`、`PyDLL`、 `WinDLL`もしくは`OleDLL`型の一つであるべきです。

  `__getattr__`は特別なはたらきをします: ライブラリローダーインスタンスの 属性として共有ライブラリにアクセスするとそれがロードされるということを可能にします。 結果はキャッシュされます。そのため、繰り返し属性アクセスを行うと いつも同じライブラリが返されます。

`LoadLibrary`( | name)

  共有ライブラリをプロセスへロードし、それを返します。 このメソッドはライブラリの新しいインスタンスを常に返します。

これらの前もって作られたライブラリローダーを利用することができます:

`cdll`
  `CDLL`インスタンスを作ります。

`windll`
  Windows用: `WinDLL`インスタンスを作ります。

`oledll`
  Windows用: `OleDLL`インスタンスを作ります。

`pydll`
  `PyDLL`インスタンスを作ります。

C Python api に直接アクセするために、すぐに使用できる Python共有ライブラリオブジェクトが用意されています:

`pythonapi`
  属性としてPython C api関数を公開する`PyDLL`のインスタンス。 これらすべての関数はC `int`を返すと仮定されますが、もちろん常に正しいとは 限りません。そのため、これらの関数を使うためには 正しい`restype`属性を代入しなければなりません。