¿Cómo llamo a las funciones DLL de Windows desde Ruby?

Quiero acceder a funciones dentro de una DLL usando Ruby. Quiero usar el acceso de bajo nivel de C y al mismo tiempo conservar la simplicidad de escribir el código Ruby. ¿Cómo logro esto?

Echa un vistazo a Win32API stdlib. Es una interfaz bastante fácil (pero arcana) para la API de Windows 32 o DLL.

La documentación está aquí , algunos ejemplos aquí . Para darle un gusto:

 require "Win32API" def get_computer_name name = " " * 128 size = "128" Win32API.new('kernel32', 'GetComputerName', ['P', 'P'], 'I').call(name, size) name.unpack("A*") end 

Puede usar Fiddle: http://ruby-doc.org/stdlib-2.0.0/libdoc/fiddle/rdoc/Fiddle.html

Fiddle es un módulo poco conocido que se agregó a la biblioteca estándar de Ruby en 1.9.x. Te permite interactuar directamente con las bibliotecas de C de Ruby.

Funciona envolviendo libffi, una popular biblioteca de C que permite que el código escrito en un idioma llame a los métodos escritos en otro. En caso de que no hayas oído hablar de él, “ffi” significa “interfaz de función externa”. Y no está solo limitado a C. Una vez que aprenda Fiddle, puede usar bibliotecas escritas en Rust y otros idiomas que lo admiten.

http://blog.honeybadger.io/use-any-c-library-from-ruby-via-fiddle-the-ruby-standard-librarys-best-kept-secret/

 require 'fiddle' libm = Fiddle.dlopen('/lib/libm.so.6') floor = Fiddle::Function.new( libm['floor'], [Fiddle::TYPE_DOUBLE], Fiddle::TYPE_DOUBLE ) puts floor.call(3.14159) #=> 3.0 

o

 require 'fiddle' require 'fiddle/import' module Logs extend Fiddle::Importer dlload '/usr/lib/libSystem.dylib' extern 'double log(double)' extern 'double log10(double)' extern 'double log2(double)' end # We can call the external functions as if they were ruby methods! puts Logs.log(10) # 2.302585092994046 puts Logs.log10(10) # 1.0 puts Logs.log2(10) # 3.321928094887362 

Creo que también puedes usar ruby ​​/ dl http://groups.google.com/group/comp.lang.ruby/browse_thread/thread/95a483230caf3d39

o ffi lo hace más fácil y más compatible con VM:

https://github.com/ffi/ffi/wiki/Windows-Examples

Existe el “reemplazo directo de Win32 -api para Win32API” de Daniel Berger. Sin embargo, parece que puede no mantenerse actualizado, ya que lo ha dejado a la comunidad de código abierto. No se ha actualizado desde el 18 de marzo de 2015. Admite hasta ruby ​​2.2 a partir de esta respuesta.