methods=
sublibraries=dl.import
requires=
classes=DL,DL=DLError,DL=DLTypeError,DL=Handle,DL=CPtr,DL=CFunc
is_sublibrary=false

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



=== Ȥ

̾ [[lib:dl/import]] 饤֥ require  [[c:DL::Importer]] ⥸塼Ѥޤ
[[c:DL]] ⥸塼뼫Τϥץߥƥ֤ʵǽ󶡤Ƥޤ
[[c:DL::Importer]] ⥸塼ϰʲΤ褦˥桼⥸塼ĥǻȤޤ

  require "dl/import"
  module M
    extend DL::Importer
  end

ʸ塢Υ⥸塼 dlload  extern ʤɤΥ᥽åɤѤǤ褦ˤʤޤ
ʲΤ褦 dlload Ȥäƥ饤֥ɤ
Ѥ饤֥ؿФ extern ᥽åɤƤ
åѡ᥽åɤޤ

  require "dl/import"
  module M
    extend DL::Importer
    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 M.strlen('abc') #=> 3

M.strlen Ѥ뤳Ȥǡ饤֥ؿ strlen() ѤǤޤ
Ϳ줿ؿ̾κǽʸʸʤ顢
᥽å̾κǽʸϾʸˤʤޤ

==== ¤Τ򰷤

¤ΤⰷȤǤޤȤ [[man:gettimeofday(2)]]
ȤäƸ߻ϰʲΤȤǤ

 require 'dl/import'
 module M
   extend DL::Importer
   dlload "libc.so.6"
   extern('int gettimeofday(void *, void *)')
   Timeval = struct( ["long tv_sec",
                      "long tv_usec"])
 end
 
 timeval = M::Timeval.malloc
 e = M.gettimeofday(timeval, nil)

 if e == 0
  p timeval.tv_sec #=> 1173519547
 end

ǡγƤ M::Timeval.new ǤϤʤ
M::Timeval.malloc ѤƤ뤳ȤդƤ

==== Хå

ʲΤ褦˥⥸塼ؿ bind ѤХåǤޤ

  require 'dl/import'
  module M 
    extend DL::Importer
    dlload "libc.so.6"
    QsortCallbackWithoutBlock = bind("void *qsort_callback(void*, void*)", :temp)
    QsortCallback             = bind("void *qsort_callback2(void*,void*)"){|ptr1,ptr2| ptr1[0] <=> ptr2[0]}
    extern 'void qsort(void *, int, int, void *)'
  end

  buff = "3465721"
  M.qsort(buff, buff.size, 1, M::QsortCallback)
  p buff #=>   "1234567"

  M.qsort(buff, buff.size, 1, M::QsortCallbackWithoutBlock){|ptr1,ptr2| ptr2[0] <=> ptr1[0]}
  p buff #=>   "7654321"

 M::QsortCallback ϥ֥åƤ [[c:DL::Function]] ֥ȤǤ


==== ݥ󥿤򰷤

Ȥƥݥ󥿤ؿФƤϡݥ󥿤Ѥ
ʸϤޤʸϥݥ󥿤ؤΰȤưޤ

 require 'dl/import' 
 
 module M
   extend DL::Importer
   dlload 'libc.so.6'
   extern 'void * memmove(void *, void *, unsigned long)'
 end
 
 s = 'xxxyyyzzz'
 M.memmove(s, 'abc', 3)
 p s                    #=> "abcyyyzzz"

char * ʳηΥݥ󥿤ؿФƤʸϤޤ

 module M
   extend DL::Importer
   dlload 'libm.so.6'
   extern 'double modf(double, double *)'
 end 
 
 s = ' ' * 8
 p M2.modf(1.25, s)  #=> 0.25
 p s.unpack('d')[0]  #=> 1.0
