Ruby 1.8.7 リファレンスマニュアル > ライブラリ一覧 > dlライブラリ > DLモジュール

module DL

クラスの継承リスト: DL

要約

UNIX の dlopen(3) や Windows の LoadLibrary() などのダイナミックリンカへの低レベルな インターフェースを提供するモジュールです。

モジュール DL は 3 つのクラスから成っています。

DL::Symbol

ダイナミックライブラリの関数のラッパークラスです。

DL::PtrData

C のポインタのようなメモリブロックを表すクラスです。

DL::Handle

オープンされたダイナミックライブラリを表すクラスです。

Type specifiers

プロトタイプは以下の型修飾子から成ります。プロトタイプの最初の要素は戻り値 の型を意味します。残りの要素は各引数の型を意味します。

C

文字 (char)

c

文字を指すポインタ (char *)

H

short 整数 (short)

h

short 整数を指すポインタ (short *)

I

整数 (char, short, int)

i

整数を指すポインタ (char *, short *, int *)

L

long int

l

long int へのポインタ (long *)

F

実数 (float)

f

実数へのポインタ (float *)

D

実数 (double)

d

実数へのポインタ(double *)

S

不変 (immutable) の文字列 (const char *)

s

変更可能(mutable)な文字列 (char *)

A

配列 (const type[])

a

変更可能 (mutable) な配列 (type[])

P

ポインタ (void *)

p

変更可能 (mutable) なポインタ (void *)

0

void 関数 (これはプロトタイプの最初の文字でなければならない)

cbtype は型修飾子 0, C, I, H, L, F, D, S そして P から成ります。 例えば,

DL.callback('IPP'){|ptr1,ptr2|
  str1 = ptr1.ptr.to_s
  str2 = ptr2.ptr.to_s
  str1 <=> str2
}

Ruby のオブジェクトから C の型への変換

DL.#callbackDL::Handle#sym で指定した 型指定子に従って Ruby のオブジェクトと C の型は相互に変換されます。

目次

特異メソッド
last_error last_error= win32_last_error win32_last_error=
モジュール関数
callback define_callback dlopen malloc remove_callback sizeof strdup
定数
ALIGN_DOUBLE ALIGN_FLOAT ALIGN_INT ALIGN_LONG ALIGN_SHORT ALIGN_VOIDP DLSTACK FREE FuncTable MAX_ARG RTLD_GLOBAL RTLD_LAZY RTLD_NOW

特異メソッド

last_error[permalink][rdoc]
last_error=

[TODO]

win32_last_error[permalink][rdoc]
win32_last_error=

[TODO]

モジュール関数

callback(type) -> DL::Symbol[permalink][rdoc]
define_callback(type) -> DL::Symbol

[TODO]

Cレベルのコールバック関数を定義し、その関数(へのポインタ)を保持した DL::Symbol を返します。

[PARAM] type:
コールバック関数の型指定子を与えます。
[EXCEPTION] DL::DLError:
定義できるコールバック関数の数には制限があります。それを越えると、DL::DLError が発生します。
require 'dl/import'
strlast = DL.callback('IS'){|s|
  s[-1]
}

module M
  extend DL::Importable
  dlload "./libtest.so"
  extern "int call(void *, const char*)"
end
p LIBC.call(strlast, "abcd").chr #=> "d"
 /* libtest.so */
 int call(int (*cb)(const char*), const char* s){
   return (*cb)(s);
 }
dlopen(lib) -> DL::Handle[permalink][rdoc]
dlopen(lib) {|handle| ... } -> DL::Handle

ダイナミックライブラリ lib をロードし、 DL::Handle として返します。

ブロックが与えられている場合は、DL::Handle 引数として 与えられたブロックを実行します。DL::Handle を返します。

DL::Handle.new(lib) と等価です。

[PARAM] lib:
ロードしたいライブラリを文字列で与えます。
[EXCEPTION] RuntimeError:
dlopen(3) に失敗した時に発生します。
malloc(size) -> DL::PtrData[permalink][rdoc]

size バイトのメモリ領域を確保し、 その領域を指す DL::PtrData オブジェクトを返します。

この返り値には、DL::FREE が free 関数としてセットされています。

[PARAM] size:
必要なメモリ領域のサイズを指定します。
remove_callback(sym) -> nil[permalink][rdoc]

コールバック関数 sym を DL::FuncTable から削除します。 以後 sym.call を呼ぶことができなくなります。

[PARAM] sym:
テーブルから削除したい DL::Symbol オブジェクトを与えます。
sizeof(type) -> Integer[permalink][rdoc]

型のサイズを返します。

sizeof("C") + sizeof("L") は、sizeof("CL") と等価ではありません。 後者は構造体 struct foo { char c; long l; } の 十分なサイズを返すと推定されますが、 そのサイズは C の sizeof(foo) と同じではないかもしれません。 つまり、sizeof メソッドは独自にアラインメントを考慮してサイズを決定 しますが、 C 言語のそれとは異なるかもしれません。

sizeof("L3") のように型の後に数字を付けることもできます。 指定できる型については DL を参照してください。

[PARAM] type:
型指定子を文字列で与えます。
[EXCEPTION] DL::DLTypeError:
定められた文字以外を型指定子として与えると発生します。
strdup(str) -> DL::PtrData[permalink][rdoc]

文字列 str を複製し、その新しい文字列へのポインタ DL::PtrData オブジェクトを返します。

この返り値には、DL::FREE が free 関数としてセットされています。

[PARAM] str:
文字列を与えます。

定数

ALIGN_DOUBLE[permalink][rdoc]

[TODO]

ALIGN_FLOAT[permalink][rdoc]

[TODO]

ALIGN_INT[permalink][rdoc]

[TODO]

ALIGN_LONG[permalink][rdoc]

[TODO]

ALIGN_SHORT[permalink][rdoc]

[TODO]

ALIGN_VOIDP[permalink][rdoc]

[TODO]

DLSTACK[permalink][rdoc]

[TODO]

FREE[permalink][rdoc]

[TODO]

free(3) を表す DL::Symbol です。 この定数に新たに DL::Symbol を代入しても、DL::PtrData にデフォルトでセットされる free 関数が変わることはありません。

FuncTable[permalink][rdoc]

[TODO]

MAX_ARG[permalink][rdoc]

[TODO]

RTLD_GLOBAL[permalink][rdoc]

[TODO]

RTLD_LAZY[permalink][rdoc]

[TODO]

RTLD_NOW[permalink][rdoc]

[TODO]