Ruby 1.8.7 リファレンスマニュアル > ライブラリ一覧 > dlライブラリ
*.dllや*.soなど、ダイナミックリンクライブラリを扱うためのライブラリです。
このライブラリは 2.2.0 で削除されました。2.2.0 以降では fiddle を利用してください。
Ruby/DL は、UNIX の dlopen(3) や Windows の LoadLibrary() などの ダイナミックリンカへのインタフェースを提供します。
通常は、DL::Importable モジュールを使用します。 これは DL モジュールの便利なラッパーです。 ある Ruby のモジュールを拡張するには以下のように使用します。
require "dl/import" module LIBC extend DL::Importable end
以後、このモジュールの dlload と extern メソッドを使用できます。 以下のように dlload 使ってライブラリをロードし、 それぞれのライブラリ関数に対して extern を使用することで ラッパーメソッドを定義します。
module LIBC
extend DL::Importable
dlload "libc.so.6","libm.so.6"
extern "int strlen(char*)"
end
# Note that we should not include the module M from some reason.
p LIBC.strlen('abc') #=> 3
LIBC.strlen を使用することで、ライブラリ関数 strlen() を使用できます。 与えられた関数名の最初の文字が大文字なら、 定義されるメソッド名の最初の文字は小文字になります。
構造体も扱うことができます。たとえば gettimeofday(2) を使って現在時刻を得たい場合は以下のとおりです。
require 'dl/import'
module LIBC
extend DL::Importable
dlload "libc.so.6"
extern('int gettimeofday(void *, void *)')
end
timeval = DL.malloc(DL.sizeof('LL'))
timeval.struct!('LL', :tv_sec, :tv_usec)
e = LIBC.gettimeofday(timeval, nil)
if e == 0
p timeval[:tv_sec] #=> 1173519547
end
構造体や共用体の作成には、以下のように dl/struct で定義されている DL::Importable::Internal#struct メソッドや DL::Importable::Internal#union メソッドを使用することもできます。
require 'dl/import'
require "dl/struct"
module LIBC
extend DL::Importable
dlload "libc.so.6"
extern('int gettimeofday(void *, void *)')
Timeval = struct ["long tv_sec", "long tv_usec"]
end
timeval = LIBC::Timeval.malloc # allocate memory.
e = LIBC.gettimeofday(timeval, nil)
if e == 0
p timeval.tv_sec #=> 1173519547
end
上の例で、メモリの割り当てに LIBC::Timeval.new ではなく、 LIBC::Timeval.malloc を使用していることに注意してください。 LIBC::Timeval.new は作成済みの PtrData オブジェクトをラップするためのものです。
以下のように モジュール関数 callback を使用したコールバックを定義できます。
require 'dl/import'
module M
extend DL::Importable
dlload "libc.so.6"
COMPARE = DL.callback('IPP'){|ptr1, ptr2|
str1 = ptr1.ptr.to_s
str2 = ptr2.ptr.to_s
ret = str1[-1] <=> str2[-1]
}
extern 'void qsort(void *, int, int, void *)'
end
a = ['1b', '2a', '3c']
ap = a.to_ptr
M.qsort(ap, a.size, DL.sizeof('P'), M::COMPARE)
p ap.to_a('P').map{|s| s.to_s } #=> ["2a", "1b", "3c"]
ここで M::COMPARE は、ブロックを呼ぶ DL::Symbol オブジェクトです。
DL::Importable モジュールはとても便利です。 しかし、ときにはdlsym() のような低レベル関数を 直接使わなければならない場面に遭遇します。 このような場合には DL モジュールの関数を使用することになるでしょう。 これについては DL で説明します。
| DL::Handle | オープンされたダイナミックライブラリを表すクラスです。 dlopen(3) が返すハンドラーのラッパーです。 |
| DL::PtrData | メモリ領域を表すクラスです。C 言語のポインタに相当します。 |
| DL::Symbol | ダイナミックライブラリの関数を表すクラスです。 |
| DL | UNIX の dlopen(3) や Windows の LoadLibrary() などのダイナミックリンカへの低レベルな インターフェースを提供するモジュールです。 |
| DL::MemorySpace |
| DL::DLError | DL に関する一般的なエラーが発生したときに投げられます。 |
| DL::DLTypeError | 型に関するエラーが発生したときに投げられます。 |
| dl/import | |
| dl/struct | DL::Importable を extend したモジュールに構造体/共用体を定義する機能を与えます。 |
| dl/types | improt dl |
| dl/win32 | Ruby/DL が Win32API と互換性を持つようにするライブラリ。 |