requires=
classes=DL,DL=DLError,DL=DLTypeError,DL=Handle,DL=PtrData,DL=MemorySpace,DL=Symbol
methods=String/i.to_ptr.dl,Array/i.to_ptr.dl,IO/i.to_ptr.dl
sublibraries=dl.import,dl.types,dl.struct,dl.win32
is_sublibrary=false

*.dll*.soʤɡʥߥå󥯥饤֥򰷤Υ饤֥Ǥ



Ruby/DL ϡUNIX  [[man:dlopen(3)]] 
Windows  LoadLibrary() ʤɤ
ʥߥå󥫤ؤΥ󥿥ե󶡤ޤ


=== Using Ruby/DL

̾ϡ[[c:DL::Importable]] ⥸塼Ѥޤ
 [[c: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() ѤǤޤ
Ϳ줿ؿ̾κǽʸʸʤ顢
᥽å̾κǽʸϾʸˤʤޤ

==== ¤Τ򰷤

¤ΤⰷȤǤޤȤ [[man: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

¤Τ䶦ΤκˤϡʲΤ褦 [[lib:dl/struct]] Ƥ
[[m:DL::Importable::Internal#struct]] ᥽åɤ
[[m: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 ϡ֥åƤ [[c:DL::Symbol]] ֥ȤǤ

DL::Importable ⥸塼ϤȤƤǤ
Ȥˤdlsym() Τ褦٥ؿ
ľܻȤʤФʤʤ̤ޤ
Τ褦ʾˤ DL ⥸塼δؿѤ뤳ȤˤʤǤ礦
ˤĤƤ [[c:DL]] ޤ
